ClusterClient是一個(gè)集群客戶端,主要用于集群外部系統(tǒng)與集群通信,只需要知道一個(gè)集群中的節(jié)點(diǎn)作為初始的聯(lián)絡(luò)點(diǎn)。就可將這個(gè)節(jié)點(diǎn)注冊(cè)為該集群的接待員(receptionist? actor),通過這個(gè)接待員我們就可以在外部系統(tǒng)建立通信了。ClusterClient會(huì)監(jiān)視與接待員的連接,如果連接故障了,它會(huì)建立一條新的連接。當(dāng)查找一個(gè)新的接待員時(shí),它會(huì)從之前的建立的節(jié)點(diǎn)中獲取新的聯(lián)絡(luò)點(diǎn),或者周期性的刷新聯(lián)絡(luò)點(diǎn)。所以聯(lián)絡(luò)點(diǎn)不一定是初始聯(lián)絡(luò)點(diǎn)。
當(dāng)你使用集群客戶端時(shí),必須要更改akka.actor.provider,將local改為remote或cluster。
? ? 接待員在集群中所有的節(jié)點(diǎn)上啟動(dòng)。接待員可以是?ClusterReceptionist?擴(kuò)展的也可以是一個(gè)普通的actor 。
集群中的actor需要在mediator中注冊(cè),然后Cluster Client就可以通過 集群中的接待員 來訪問mediator的注冊(cè)表中的任何actor。
在Cluster Client中也有一個(gè)集群客戶端接待員ClusterClientReceptionist? 將客戶端能訪問到的節(jié)點(diǎn)注冊(cè)到列表中。就像mediator一樣?ClusterClient?和?ClusterClientReceptionist?之間發(fā)送的事件可以訂閱。? ? 訂閱發(fā)送消息的類型有三種
①.ClusterClient.Send?
將消息發(fā)送至任意一節(jié)點(diǎn)
②.ClusterClient.SendToAll
消息將會(huì)發(fā)給集群中的所有匹配path的節(jié)點(diǎn)
③.ClusterClient.Publish
將消息發(fā)送給訂閱了某個(gè)主題的所有actor
接待員打開專門的通道讓目標(biāo)actor的響應(yīng)消息發(fā)送到客戶端。可以避免其他集群中的節(jié)點(diǎn)干擾
因?yàn)榭蛻舳送ǔ?yīng)該通過ClusterClient發(fā)送后續(xù)消息。如果客戶端直接聯(lián)系集群中的actor,那actor的回復(fù)可以發(fā)送到原始發(fā)送方。
消息緩沖:當(dāng)向新接待員建立連接時(shí),ClusterClient會(huì)緩沖消息,等連接建立完成后再發(fā)送消息。如果緩存滿了ClusterClient會(huì)將舊的消息拋棄。可以通過配置來改變緩沖區(qū)的大小,0代表禁用。(具體配置見下文- 配置)
防止消息丟失:為了防止消息丟失客戶端actor和目標(biāo)actor之間也要保證?at-least-once message delivery(至少一次通信)。
一個(gè)集群客戶端示例:
?首先在集群中的節(jié)點(diǎn)啟動(dòng)接待員,配置擴(kuò)展屬性。
akka.extensions = ["akka.cluster.client.ClusterClientReceptionist"]
(ClusterClientReceptionist?使用?DistributedPubSub擴(kuò)展)
然后在ClusterClientReceptionist中注冊(cè)客戶端可用的actor
在客戶端,創(chuàng)建ClusterClient actor 并向集群中的某個(gè)地方發(fā)送識(shí)別消息。
上面代碼中initialContacts參數(shù)是Set[ActorPath],可以這樣配置
事件
上文說道ClusterClient?和?ClusterClientReceptionist?之間發(fā)送的事件可以訂閱,因此有一個(gè)actor來接收(contact points)可用接待員的地址。
同樣地,我們還要?jiǎng)?chuàng)建一個(gè)actor來接收與ClusterClientReceptionist連接的cluster client
依賴
使用Cluster Client要添加以下依賴
"com.typesafe.akka" %% "akka-cluster-tools" % "2.5.11"
配置
配置中看到當(dāng)集群客戶端啟動(dòng)時(shí),必須提供一個(gè)初始聯(lián)系列表,該列表是接待員正在運(yùn)行的集群節(jié)點(diǎn)。然后,它會(huì)重復(fù)地嘗試聯(lián)系那些直到它與其中一個(gè)的聯(lián)系成功。(上文配置中establishing-get-contacts-interval)。?在運(yùn)行時(shí),通過來自Receptionist的數(shù)據(jù)聯(lián)系列表會(huì)不斷地更新。(上文配置中 refresh-contacts-interval )
當(dāng)客戶端正在運(yùn)行時(shí),它會(huì)檢測(cè)到與receptionist?的連接失敗,如果超過了可配置的心跳次數(shù),客戶將嘗試重新連接到它已知的聯(lián)系列表,以找到它可以訪問的接待員。
reconnect-timeout配置時(shí)間間隔,在超過規(guī)定時(shí)間間隔中客戶端找到一個(gè)receptionist?連接到集群時(shí),cluster client將被停止。在新地址上重新啟動(dòng),然后通過訪問某種服務(wù)注冊(cè)中心來更新一組初始聯(lián)系人,從而啟動(dòng)一個(gè)新的集群客戶端。