Akka Cluster Sharding provides location transparency and automatic distribution of stateful actors across cluster nodes
ClusterShardingSettings provides comprehensive configuration for tuning sharding behavior, performance, and operational characteristics. It supports both programmatic configuration and configuration file-based setup.
Use default configuration from akka.cluster.sharding:
object ClusterShardingSettings {
def apply(system: ActorSystem): ClusterShardingSettings
}Usage Example:
val settings = ClusterShardingSettings(system)Create settings from a custom configuration:
def apply(config: Config): ClusterShardingSettingsUsage Example:
val config = system.settings.config.getConfig("my-sharding")
val settings = ClusterShardingSettings(config)class ClusterShardingSettings(
role: Option[String],
rememberEntities: Boolean,
journalPluginId: String,
snapshotPluginId: String,
stateStoreMode: String,
rememberEntitiesStore: String,
passivationStrategy: PassivationStrategy,
shardFailureBackoff: FiniteDuration,
entityRestartBackoff: FiniteDuration,
rebalanceInterval: FiniteDuration,
snapshotAfter: Int,
keepNrOfBatches: Int,
leastShardAllocationRebalanceThreshold: Int,
leastShardAllocationMaxSimultaneousRebalance: Int,
waitingForStateTimeout: FiniteDuration,
updatingStateTimeout: FiniteDuration,
coordinatorSingletonSettings: ClusterSingletonManagerSettings,
coordinatorSingletonRole: Option[String],
usePassivateIdleEntities: Boolean,
tuningParameters: TuningParameters,
coordinatorStateWriteMajorityPlus: Int,
coordinatorStateReadMajorityPlus: Int,
leastShardAllocationAbsoluteLimit: Int,
leastShardAllocationRelativeLimit: Double
)object ClusterShardingSettings {
val StateStoreModePersistence = "persistence"
val StateStoreModeDData = "ddata"
}StateStoreModePersistence: Use Akka Persistence for state storage (deprecated)StateStoreModeDData: Use Akka Distributed Data for state storage (recommended)private[akka] val RememberEntitiesStoreDData = "ddata"
private[akka] val RememberEntitiesStoreEventsourced = "eventsourced"
private[akka] val RememberEntitiesStoreCustom = "custom"class TuningParameters(
coordinatorFailureBackoff: FiniteDuration,
retryInterval: FiniteDuration,
bufferSize: Int,
handOffTimeout: FiniteDuration,
shardStartTimeout: FiniteDuration,
shardFailureBackoff: FiniteDuration,
entityRestartBackoff: FiniteDuration,
rebalanceInterval: FiniteDuration,
snapshotAfter: Int,
keepNrOfBatches: Int,
leastShardAllocationRebalanceThreshold: Int,
leastShardAllocationMaxSimultaneousRebalance: Int,
waitingForStateTimeout: FiniteDuration,
updatingStateTimeout: FiniteDuration,
entityRecoveryStrategy: String,
entityRecoveryConstantRateStrategyFrequency: FiniteDuration,
entityRecoveryConstantRateStrategyNumberOfEntities: Int,
coordinatorStateWriteMajorityPlus: Int,
coordinatorStateReadMajorityPlus: Int,
leastShardAllocationAbsoluteLimit: Int,
leastShardAllocationRelativeLimit: Double,
passivationStopTimeout: FiniteDuration
)coordinatorFailureBackoff: Backoff when coordinator fails (default: 5s)retryInterval: Interval for retrying failed operations (default: 2s)bufferSize: Message buffer size for pending operations (default: 1000)handOffTimeout: Timeout for shard handoff during rebalancing (default: 10s)shardStartTimeout: Timeout for starting new shards (default: 10s)rebalanceInterval: Interval between rebalancing attempts (default: 10s)snapshotAfter: Number of changes before taking snapshot (default: 1000)class PassivationStrategySettings(
strategy: PassivationStrategy,
idleEntitySettings: Option[IdleSettings],
oldestEntitySettings: Option[OldestSettings],
mostRecentlyUsedEntitySettings: Option[MostRecentlyUsedSettings],
leastRecentlyUsedEntitySettings: Option[LeastRecentlyUsedSettings],
leastFrequentlyUsedEntitySettings: Option[LeastFrequentlyUsedSettings]
)class IdleSettings(
timeout: FiniteDuration,
interval: FiniteDuration
)Configuration Example:
akka.cluster.sharding {
passivation {
strategy = idle
idle-entity {
timeout = 2m
interval = 1m
}
}
}class OldestSettings(
segmentSize: Int,
proportionToPassivatePerRebalance: Double,
idleTimeBeforeCleanUp: FiniteDuration
)
class LeastRecentlyUsedSettings(
segmentSize: Int,
proportionToPassivatePerRebalance: Double,
idleTimeBeforeCleanUp: FiniteDuration
)
class MostRecentlyUsedSettings(
segmentSize: Int,
proportionToPassivatePerRebalance: Double,
idleTimeBeforeCleanUp: FiniteDuration
)
class LeastFrequentlyUsedSettings(
segmentSize: Int,
proportionToPassivatePerRebalance: Double,
idleTimeBeforeCleanUp: FiniteDuration
)def withRole(role: String): ClusterShardingSettings
def withRole(role: Option[String]): ClusterShardingSettingsUsage Example:
val settings = ClusterShardingSettings(system)
.withRole("worker")def withRememberEntities(rememberEntities: Boolean): ClusterShardingSettingsdef withStateStoreMode(mode: String): ClusterShardingSettingsdef withPassivationStrategy(strategy: PassivationStrategy): ClusterShardingSettingsComplete configuration example in application.conf:
akka.cluster.sharding {
# Number of shard regions that must be available for the coordinator
# to continue processing commands
waiting-for-state-timeout = 5s
# Timeout for updating distributed state (write/read)
updating-state-timeout = 5s
# The shard region for a entity type can be started on nodes filtered by role
role = "worker"
# When 'remember-entities' is enabled the Shard will automatically restart
# entities that were previously running in the shard
remember-entities = off
# Set this to a time duration to have sharding passivate entities when they have not
# received any message in this length of time
passivation {
strategy = idle
idle-entity {
timeout = 2m
interval = 1m
}
}
# Rebalancing is performed periodically based on this interval
rebalance-interval = 10s
# Absolute limit of how many shards the rebalance algorithm will rebalance
# in one rebalance round
least-shard-allocation-strategy.rebalance-absolute-limit = 20
# Relative limit of how many shards the rebalance algorithm will rebalance
# in one rebalance round.
least-shard-allocation-strategy.rebalance-relative-limit = 0.1
# The coordinator saves persistent snapshots after this number of changes
snapshot-after = 1000
# Setting for the default shard allocation strategy
tuning {
coordinator-failure-backoff = 5s
retry-interval = 2s
buffer-size = 1000
handoff-timeout = 10s
shard-start-timeout = 10s
shard-failure-backoff = 10s
entity-restart-backoff = 10s
rebalance-interval = 10s
snapshot-after = 1000
keep-nr-of-batches = 2
}
# Settings for the coordinator singleton
coordinator-singleton = ${akka.cluster.singleton}
# Settings for remember entities store when using ddata
distributed-data {
# minCap parameter to MajorityWrite and MajorityRead consistency level
majority-min-cap = 5
durable.keys = ["shard-*"]
# When using many entities with "remember entities" the Gossip message
# can become to large if including to many in same message. Limit to 10 entries.
max-delta-elements = 10
}
}coordinatorSingletonSettings: ClusterSingletonManagerSettings
coordinatorSingletonRole: Option[String]Control how entities are recovered when remember-entities is enabled:
"all": Recover all entities immediately (default)"constant": Recover entities at a constant rateuseLeaseForRebalancing: Boolean
leaseSettings: Option[LeaseUsageSettings]The settings are validated on creation:
Install with Tessl CLI
npx tessl i tessl/maven-com-typesafe-akka--akka-cluster-sharding-2-13