Akka 2.5.11 分布式發(fā)布訂閱

Distributed Publish Subscribe in Cluster

通過(guò)了解Akka集群后,我們可能會(huì)產(chǎn)生兩個(gè)問(wèn)題

如果我們要發(fā)送消息到某個(gè)actor但是我們不知道它在哪個(gè)節(jié)點(diǎn)運(yùn)行掌测,該如何發(fā)送锐想?

如果我們要給訂閱某種Topic的所有actor發(fā)送消息莫换,該如何發(fā)送?

于是Akka提供了一個(gè)中介actor:

akka.cluster.pubsub.DistributedPubSubMediator

它在所有的節(jié)點(diǎn)上啟動(dòng)陪竿,用來(lái)管理actor引用的注冊(cè)表(比如灭忠,將actor的id與其actorRef對(duì)應(yīng)存入Map中 )。而且這些注冊(cè)表是具有最終一致性肥败,當(dāng)某個(gè)節(jié)點(diǎn)發(fā)生變化趾浅,這個(gè)節(jié)點(diǎn)上的mediator不會(huì)立即通知其他節(jié)點(diǎn)愕提,而是將變化的信息進(jìn)行版本化,幾秒后通過(guò)gossip 協(xié)議將變化的增量 復(fù)制到其他節(jié)點(diǎn)的mediator皿哨。

因此你就可以通過(guò)任意一個(gè)節(jié)點(diǎn)上的mediator 來(lái)向任何其他節(jié)點(diǎn)的actor通信

對(duì)于一開(kāi)始的兩個(gè)問(wèn)題浅侨,mediator有兩種消息傳遞模式:Publish與Send,下面將介紹具體的實(shí)現(xiàn)方法和過(guò)程证膨。

Publish

這是一種 Pub/Sub 模式(如聊天室)如输,

通過(guò)DistributedPubSubMediator.Subscribe方法來(lái)將訂閱這個(gè)主題的actor注冊(cè)到本地的mediator中。

通過(guò) DistributedPubSubMediator.SubscribeAck ? 和DistributedPubSubMediator.UnSubscribeAck 確認(rèn)是否訂閱成功央勒,一段時(shí)間后會(huì)將該訂閱變化復(fù)制到其他節(jié)點(diǎn)的mediator

最后我們向本地的mediator發(fā)送DistributedPubSubMediator.Publish就可以將消息發(fā)布給所有訂閱的actor

如果actor被終止不见,它將在訂閱的注冊(cè)表中被自動(dòng)移除。

actor也可以用group id 來(lái)進(jìn)行訂閱崔步,發(fā)布的這個(gè)主題的消息就會(huì)向每個(gè)group中隨機(jī)選一個(gè)actor發(fā)送稳吮。如果恰好訂閱消息的都是同一個(gè)group 的actor。那么mediator只需要發(fā)送到其中一個(gè)actor就可以刷晋。

使用sendOneMessageToEachGroup? (true/false)可以設(shè)置是否將消息發(fā)送給使用group id訂閱的actor盖高。

Send

則是一個(gè) point-to-point 模式(例如 私聊),每個(gè)消息都會(huì)投遞到一個(gè)目的地眼虱,即使你不知道目的地在哪里喻奥。

發(fā)送的消息會(huì)通過(guò)一個(gè)匹配路徑(因?yàn)椴恢滥康牡卦谀模栽撀窂讲粠в械刂沸畔ⅲ﹣?lái)發(fā)給mediator捏悬。節(jié)點(diǎn)中的每個(gè)actor通過(guò)DistributedPubSubMediator.Put?將其ActorRef注冊(cè)到本地的mediator中撞蚕,所以在本地actor system中路徑是唯一的,通過(guò)path關(guān)鍵字即可找到目的actor过牙。

換句話說(shuō)甥厦,匹配路徑(path)=邏輯路徑,地址信息(address)=物理路徑寇钉。mediator 通過(guò)將帶有邏輯路徑的消息廣播給各個(gè)節(jié)點(diǎn)actor system刀疙。因?yàn)樵诿總€(gè)actor system中actor 的路徑是唯一的,所以消息只需要知道actor的邏輯路徑就可以找到相應(yīng)的actor來(lái)發(fā)送消息扫倡。

如果有多個(gè)actor與path匹配(具有相同path的actor可以在不同的節(jié)點(diǎn)上注冊(cè))谦秧,將使用RoutingLogic (默認(rèn)隨機(jī))發(fā)送到其中一個(gè)。(可以設(shè)置本地偏好撵溃,優(yōu)先選擇本地的mediator進(jìn)行發(fā)送)

用DistributedPubSubMediator.Send發(fā)給mediator帶有path的消息

同樣如果某個(gè)actor被終止疚鲤,它將會(huì)在注冊(cè)表中自動(dòng)刪除。

如果DistributedPubSubMediator.SendToAll 缘挑,可以實(shí)現(xiàn)消息廣播集歇,將消息發(fā)給所有匹配路徑的actor


實(shí)現(xiàn)上面的兩種模式都是通過(guò)mediator擴(kuò)展DistributedPubSub 來(lái)實(shí)現(xiàn),當(dāng)然mediator也可以是一個(gè)普通的actor语淘。

akka.extensions = ["akka.cluster.pubsub.DistributedPubSub"]

在分布式發(fā)布訂閱模式中只保證at-most-once delivery 诲宇,因此消息可能會(huì)丟失际歼。

如果想要at-least-once投遞保證,推薦Kafka Akka Streams integration


依賴

sbt:

"com.typesafe.akka" %% "akka-cluster-tools" % "2.4.16"

maven:??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焕窝,一起剝皮案震驚了整個(gè)濱河市蹬挺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌它掂,老刑警劉巖巴帮,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虐秋,居然都是意外死亡榕茧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)客给,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)用押,“玉大人,你說(shuō)我怎么就攤上這事靶剑◎卟Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵桩引,是天一觀的道長(zhǎng)缎讼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坑匠,這世上最難降的妖魔是什么血崭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮厘灼,結(jié)果婚禮上夹纫,老公的妹妹穿的比我還像新娘。我一直安慰自己设凹,他們只是感情好舰讹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著闪朱,像睡著了一般跺涤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上监透,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音航唆,去河邊找鬼胀蛮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糯钙,可吹牛的內(nèi)容都是我干的粪狼。 我是一名探鬼主播退腥,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼再榄!你這毒婦竟也來(lái)了狡刘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤困鸥,失蹤者是張志新(化名)和其女友劉穎嗅蔬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疾就,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澜术,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猬腰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟废。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姑荷,靈堂內(nèi)的尸體忽然破棺而出盒延,到底是詐尸還是另有隱情,我是刑警寧澤鼠冕,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布添寺,位于F島的核電站,受9級(jí)特大地震影響供鸠,放射性物質(zhì)發(fā)生泄漏畦贸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一楞捂、第九天 我趴在偏房一處隱蔽的房頂上張望薄坏。 院中可真熱鬧,春花似錦寨闹、人聲如沸胶坠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沈善。三九已至,卻和暖如春椭蹄,著一層夾襖步出監(jiān)牢的瞬間闻牡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绳矩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罩润,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓翼馆,卻偏偏與公主長(zhǎng)得像割以,于是被迫代替她去往敵國(guó)和親金度。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容