在很多應(yīng)用場(chǎng)景中都會(huì)出現(xiàn)在系統(tǒng)中需要某類Actor的唯一實(shí)例(only instance)。這個(gè)實(shí)例在集群環(huán)境中可能在任何一個(gè)節(jié)點(diǎn)上,但保證它是唯一的。Akka的Cluster-Singleton提供對(duì)這種Singleton Actor模式的支持,能做到當(dāng)這個(gè)實(shí)例所在節(jié)點(diǎn)出現(xiàn)問題需要脫離集群時(shí)自動(dòng)在另一個(gè)節(jié)點(diǎn)上構(gòu)建一個(gè)同樣的Actor,并重新轉(zhuǎn)交控制。當(dāng)然,由于涉及了一個(gè)新構(gòu)建的Actor,內(nèi)部狀態(tài)會(huì)在這個(gè)過程中丟失。Single-Actor的主要應(yīng)用包括某種對(duì)外部只能支持一個(gè)接入的程序接口,或者一種帶有由多個(gè)其它Actor運(yùn)算結(jié)果產(chǎn)生的內(nèi)部狀態(tài)的累積型Actor(aggregator)。當(dāng)然,如果使用一種帶有內(nèi)部狀態(tài)的Singleton-Actor,可以考慮使用PersistenceActor來實(shí)現(xiàn)內(nèi)部狀態(tài)的自動(dòng)恢復(fù)。如此Cluster-Singleton變成了一種非常實(shí)用的模式,可以在許多場(chǎng)合下應(yīng)用。
Cluster-Singleton模式也恰恰因?yàn)樗奈ㄒ恍蕴攸c(diǎn)存在著一些隱憂,需要特別關(guān)注。唯一性容易造成的隱憂包括:容易造成超負(fù)荷、無法保證穩(wěn)定在線、無法保證消息投遞。這些需要用戶在編程時(shí)增加特別處理。
好了,我們?cè)O(shè)計(jì)個(gè)例子來了解Cluster-Singleton,先看看Singleton-Actor的功能:
class SingletonActor extends PersistentActor with ActorLogging { import SingletonActor._ val cluster = Cluster(context.system) var freeHoles = 0 var freeTrees = 0 var ttlMatches = 0 override def persistenceId = self.path.parent.name + "-" + self.path.name def updateState(evt: Event): Unit = evt match { &nb