Akka Cluster之叢集分片
阿新 • • 發佈:2018-12-02
一、介紹
當您需要在叢集中的多個節點之間分配Actor,並希望能夠使用其邏輯識別符號與它們進行互動時,叢集分片是非常有用的。你無需關心Actor在叢集中的物理位置,因為這可能也會隨著時間的推移而發生變化。
例如,它可以是代表域驅動設計術語中聚合根的參與者。在這裡,我們稱這些Actore為“實體”。這些Actor通常具有持久狀態,但此功能不僅限於具有持久化狀態的Actor。
當你有一個很消耗資源的Actor,例如佔記憶體或者CPU,把它放在一臺機器上可能吃不消,這時候叢集分片就能夠提供很好的幫助,將這些Actor分散在叢集中的多個結點上。
二、依賴
<dependency>
<groupId>com.typesafe.akka</groupId> <artifactId>akka-cluster-sharding_2.12</artifactId> <version>2.5.18</version> </dependency>
三、例子
假設我們有如下一個需要使用叢集分片模式的實體Actor:
case object Increment case object Decrement final case class Get(counterId: Long) final case class EntityEnvelope(id: Long, payload: Any) case object Stop final case class CounterChanged(delta: Int) class Counter extends PersistentActor { import ShardRegion.Passivate context.setReceiveTimeout(120.seconds) // self.path.name is the entity identifier (utf-8 URL-encoded) override def persistenceId: String = "Counter-" + self.path.name var count = 0 def updateState(event: CounterChanged): Unit = count += event.delta override def receiveRecover: Receive = { case evt: CounterChanged ⇒ updateState(evt) } override def receiveCommand: Receive = { case Increment ⇒ persist(CounterChanged(+1))(updateState) case Decrement ⇒ persist(CounterChanged(-1))(updateState) case Get(_) ⇒ sender() ! count case ReceiveTimeout ⇒ context.parent ! Passivate(stopMessage = Stop) case Stop ⇒ context.stop(self) } }