通過(guò)上篇關(guān)于Cluster-Singleton的介紹,我們了解了Akka為分布式程序提供的編程支持:基于消息驅(qū)動(dòng)的運(yùn)算模式特別適合分布式程序編程,我們不需要特別的努力,只需要按照普通的Actor編程方式就可以實(shí)現(xiàn)集群分布式程序了。Cluster-Singleton可以保證無(wú)論集群節(jié)點(diǎn)出了任何問(wèn)題,只要集群中還有節(jié)點(diǎn)在線,都可以持續(xù)的安全運(yùn)算。Cluster-Singleton這種模式保證了某種Actor的唯一實(shí)例可以安全穩(wěn)定地在集群環(huán)境下運(yùn)行。還有一種情況就是如果有許多特別占用資源的Actor需要同時(shí)運(yùn)行,而這些Actor同時(shí)占用的資源遠(yuǎn)遠(yuǎn)超過(guò)一臺(tái)服務(wù)器的容量,如此我們必須把這些Actor分布到多臺(tái)服務(wù)器上,或者是一個(gè)由多臺(tái)服務(wù)器組成的集群環(huán)境,這時(shí)就需要Cluster-Sharding模式來(lái)幫助解決這樣的問(wèn)題了。
我把通過(guò)使用Cluster-Sharding后達(dá)到的一些目的和大家分享一下,大家一起來(lái)分析分析到底這些達(dá)成的目標(biāo)里是否包括了Actor在集群節(jié)點(diǎn)間的分布:
首先我有個(gè)Actor,它的名稱是一個(gè)自編碼,由Cluster-Sharding在集群中某個(gè)節(jié)點(diǎn)上構(gòu)建。由于在一個(gè)集群環(huán)境里所以這個(gè)Actor到底在哪個(gè)節(jié)點(diǎn)上,具體地址是什么我都不知道,我只需要用這個(gè)自編碼就可以和它溝通。如果我有許多自編碼的消耗資源的Actor,我可以通過(guò)自編碼中的分片(shard)編號(hào)來(lái)指定在其它的分片(shard)里構(gòu)建這些Actor。Akka-Cluster還可以根據(jù)整個(gè)集群中節(jié)點(diǎn)的增減按當(dāng)前集群節(jié)點(diǎn)情況進(jìn)行分片在集群節(jié)點(diǎn)調(diào)動(dòng)來(lái)重新配載(rebalance),包括在某些節(jié)點(diǎn)因故脫離集群時(shí)把節(jié)點(diǎn)上的所有Actor在其它在線節(jié)點(diǎn)上重新構(gòu)建。這樣看來(lái),這個(gè)Actor的自編碼應(yīng)該是Cluster-Sharding的應(yīng)用核心元素了。按慣例我們還是用例子來(lái)示范Cluster-Sharding的使用。我們需要分片(sharding)的Actor就是前幾篇討論里提到的Calculator:
package clustersharding.entity import akka.actor._ import akka.cluster._ import akka.persistence._ import scala.concurrent.duration._ import akka.cluster.sharding._object Calculator { sealed