Coordination
This module is currently marked as may change. It is ready to be used in production but the API may change without warning or a deprecation period.
Akka Coordination is a set of tools for distributed coordination.
Dependency
Lease
The lease is a pluggable API for a distributed lock.
Using a lease
Leases are loaded with:
- Lease name
- Config location to indicate which implementation should be loaded
- Owner name
Any lease implementation should provide the following guarantees:
- A lease with the same name loaded multiple times, even on different nodes, is the same lease
- Only one owner can acquire the lease at a time
To acquire a lease:
- Scala
-
source
val lease = LeaseProvider(system).getLease("<name of the lease>", "docs-lease", "owner") val acquired: Future[Boolean] = lease.acquire() val stillAcquired: Boolean = lease.checkLease() val released: Future[Boolean] = lease.release()
- Java
Acquiring a lease returns a Future as lease implementations typically are implemented via a third party system such as the Kubernetes API server or Zookeeper.
Once a lease is acquired checkLease
can be called to ensure that the lease is still acquired. As lease implementations are based on other distributed systems a lease can be lost due to a timeout with the third party system. This operation is not asynchronous so it can be called before performing any action for which having the lease is important.
A lease has an owner. If the same owner tries to acquire the lease multiple times it will succeed i.e. leases are reentrant.
It is important to pick a lease name that will be unique for your use case. If a lease needs to be unique for each node in a Cluster the cluster host port can be use:
For use cases where multiple different leases on the same node then something unique must be added to the name. For example a lease can be used with Cluster Sharding and in this case the shard Id is included in the lease name for each shard.
Usages in other Akka modules
Leases can be used for Cluster Singletons and Cluster Sharding.
Lease implementations
Implementing a lease
Implementations should extend the akka.coordination.lease.scaladsl.Lease
- Scala
-
source
class SampleLease(settings: LeaseSettings) extends Lease(settings) { override def acquire(): Future[Boolean] = { Future.successful(true) } override def acquire(leaseLostCallback: Option[Throwable] => Unit): Future[Boolean] = { Future.successful(true) } override def release(): Future[Boolean] = { Future.successful(true) } override def checkLease(): Boolean = { true } }
- Java
The methods should provide the following guarantees:
acquire
should complete with:true
if the lease has been acquired,false
if the lease is taken by another owner, or fail if it can’t communicate with the third party system implementing the lease.release
should complete with:true
if the lease has definitely been released,false
if the lease has definitely not been released, or fail if it is unknown if the lease has been released.checkLease
should return false until anacquire
Future has completed and should returnfalse
if the lease is lost due to an error communicating with the third party. Check lease should also not block.- The
acquire
lease lost callback should only be called after anaquire
Future has completed and should be called if the lease is lose e.g. due to losing communication with the third party system.
In addition it is expected that a lease implementation will include a time to live mechanism meaning that a lease won’t be held for ever in case the node crashes. If a user prefers to have outside intervention in this case for maximum safety then the time to live can be set to infinite.
The configuration must define the lease-class
property for the FQCN of the lease implementation.
The lease implementation should have support for the following properties where the defaults come from akka.coordination.lease
:
source# if the node that acquired the leases crashes, how long should the lease be held before another owner can get it
heartbeat-timeout = 120s
# interval for communicating with the third party to confirm the lease is still held
heartbeat-interval = 12s
# lease implementations are expected to time out acquire and release calls or document
# that they do not implement an operation timeout
lease-operation-timeout = 5s
This configuration location is passed into getLease
.