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