日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用JGroups进行ElasticMQ消息复制

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JGroups进行ElasticMQ消息复制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ElasticMQ是一臺(tái)消息服務(wù)器,具有Scala,Java和與Amazon SQS兼容的接口。 它通過跨服務(wù)器群集復(fù)制消息來支持有保證的消息傳遞,并通過日志記錄實(shí)現(xiàn)消息持久性。 消息復(fù)制是ElasticMQ的核心功能之一。 但是,如果您看一下代碼,則只有少數(shù)幾個(gè)類,最長的類有76行(請(qǐng)記住,這是Scala,雖然;))。 這是因?yàn)镋lasticMQ使用JGroups作為基礎(chǔ)通信庫。 JGroups已經(jīng)很老了,特別是對(duì)于Java庫而言-JGroups的第一個(gè)發(fā)行版是在1999年(!)。 但是,它遠(yuǎn)不是過時(shí)和過時(shí)的-它具有一個(gè)不錯(cuò)的API,可以正常工作,擁有一個(gè)良好的社區(qū)。 并且因?yàn)槿魏蜫ava庫都可以與Scala很好地協(xié)作。 JGroups具有許多有用的功能:
  • 可靠的組播
  • 集群管理
  • 故障檢測(cè)
  • 節(jié)點(diǎn)發(fā)現(xiàn)
  • 多年的性能改進(jìn)
它們廣泛用于在ElasticMQ中實(shí)施復(fù)制。 以下是其完成方式的摘要。 ElasticMQ集群如何工作? 在單個(gè)ElasticMQ集群中,一個(gè)節(jié)點(diǎn)始終是主節(jié)點(diǎn)。 您只能對(duì)此節(jié)點(diǎn)執(zhí)行操作。 然后將每個(gè)操作的結(jié)果復(fù)制到其他成員。 有兩種與阻止有關(guān)的選項(xiàng); 復(fù)制可以是完全異步的,也可以等待直到至少一個(gè)或所有節(jié)點(diǎn)確認(rèn)該操作。 為了確保在群集分區(qū)的情況下不會(huì)從不同分區(qū)收到相同的消息,只有具有至少一半+1節(jié)點(diǎn)操作的分區(qū)處于活動(dòng)狀態(tài)。 ElasticMQ中的中心概念是消息存儲(chǔ)。 存儲(chǔ)器執(zhí)行命令(例如,發(fā)送消息命令,刪除消息命令等)。 復(fù)制層只是任何其他存儲(chǔ)的包裝。 但是請(qǐng)注意,我們只能復(fù)制產(chǎn)生的存儲(chǔ)突變(因此在執(zhí)行命令之后),而不是原始命令本身。 例如,如果命令是“接收消息”,則在每臺(tái)計(jì)算機(jī)上執(zhí)行該命令的結(jié)果可能會(huì)有所不同。 因此,如果接收消息成功,我們將僅復(fù)制消息可見性的更改(在ElasticMQ中,類似于Amazon SQS ,如果接收到消息,則會(huì)在指定的時(shí)間段內(nèi)阻止后續(xù)接收該消息)。 您可以在JGroupsReplicatedStorage中看到此基本邏輯。 初始化集群 在開始復(fù)制之前,首先要做的是初始化集群。 這是在ReplicatedStorageConfigurator中完成的。 作為參數(shù),我們需要一個(gè)JGroups配置文件,該文件是協(xié)議棧。 您實(shí)際上并不需要知道每種協(xié)議的功能以及所有這些配置參數(shù)的含義。 最有用的兩個(gè)是udp.xml和tcp.xml 。 如果您的網(wǎng)絡(luò)中有多播,則應(yīng)使用第一個(gè);如果所有通信都應(yīng)通過TCP(例如,在EC2上),則應(yīng)使用第二個(gè)。 在后一種情況下,您還需要提供初始IP列表。 該列表不必詳盡無遺,只需列出種子即可。 擁有協(xié)議棧,ElasticMQ創(chuàng)建一個(gè)JChannel并將其連接,這僅意味著連接到集群。 實(shí)際上,這就是使用JGroups創(chuàng)建集群所需要做的所有工作-非常簡單,對(duì)吧? 正如您在ReplicatedStorageConfigurator的末尾看到的那樣,連接之后的第一件事是對(duì)channel.getState(null,0)的調(diào)用。 這將轉(zhuǎn)到當(dāng)前的主節(jié)點(diǎn)(稍后會(huì)進(jìn)行有關(guān)主選舉的更多信息),獲取狀態(tài)(當(dāng)前的隊(duì)列和消息)并將其應(yīng)用于當(dāng)前的節(jié)點(diǎn)(請(qǐng)參閱非常簡單的JGroupsStateTransferMessageListener-處理發(fā)送和接收)。 這里有兩件事要注意。 首先,此傳輸不會(huì)阻止整個(gè)群集正常運(yùn)行。 其次,如果在狀態(tài)轉(zhuǎn)移期間執(zhí)行了一項(xiàng)操作,則該操作也會(huì)被復(fù)制。 因此,可能會(huì)在新節(jié)點(diǎn)上執(zhí)行一次命令兩次。 但這無關(guān)緊要,因?yàn)槊總€(gè)復(fù)制的命令都是冪等的,因此可以多次應(yīng)用。 在其他情況下,必須實(shí)施某些應(yīng)用程序側(cè)機(jī)制以防止此類情況。 復(fù)制數(shù)據(jù) 最后,我們進(jìn)入核心:復(fù)制命令。 在發(fā)送方,這由JGroupsReplicationMessageSender處理。 同樣,這不是一個(gè)非常復(fù)雜的類。 它使用來自JGroups的MessageDispatcher “構(gòu)建塊”,除了在整個(gè)集群中對(duì)消息進(jìn)行多重處理外,還使您能夠等待,直到指定數(shù)量的節(jié)點(diǎn)接收到它為止。 在接收方,我們有JGroupsRequestHandler 。 同樣,非常簡單。 收到消息后,它僅發(fā)送到存儲(chǔ)。 集群管理 您可能還注意到SetMaster特殊消息。 用戶需要此權(quán)限才能讀取當(dāng)前主節(jié)點(diǎn)的節(jié)點(diǎn)地址。 主選舉(決定哪個(gè)節(jié)點(diǎn)是主節(jié)點(diǎn))完全由JGroups處理。 JGroups中沒有特定的算法來選舉主節(jié)點(diǎn),但是我們可以利用以下事實(shí):每個(gè)節(jié)點(diǎn)都有相同的集群視圖,由JGroups View類表示。 我們要做的就是簡單地從列表中獲取第一個(gè)(或最后一個(gè)或第3個(gè),等等-只要在所有節(jié)點(diǎn)上都相同),然后將其設(shè)置為主節(jié)點(diǎn)即可。 群集視圖由最后一個(gè)“核心”復(fù)制類JGroupsMembershipListener處理 。 那里發(fā)生了兩件事。 每當(dāng)新節(jié)點(diǎn)加入或離開集群時(shí),都會(huì)調(diào)用viewAccepted回調(diào)。 每個(gè)具有View類的實(shí)例(很好,等于:))的節(jié)點(diǎn)。 主機(jī)在單獨(dú)的線程中廣播其地址(這是ElasticMQ服務(wù)器地址,而不是內(nèi)部JGroups集群通信地址)。 在一個(gè)JGroups回調(diào)方法中執(zhí)行阻塞操作是一個(gè)非常容易的錯(cuò)誤。 您永遠(yuǎn)不應(yīng)該那樣做,因?yàn)檎麄€(gè)堆棧都可以鎖定。 我們還需要FLUSH協(xié)議(總是在集群設(shè)置過程中添加); 該協(xié)議可確保在所有節(jié)點(diǎn)都安裝新視圖之前,不發(fā)送新消息,因此,我們確保新節(jié)點(diǎn)始終接收主信息。 成員資格偵聽器還處理集群合并。 同樣,JGroups為我們提供了合并分區(qū)的視圖以及新的合并視圖。 在ElasticMQ中,除了主分區(qū)(最大分區(qū))以外的所有分區(qū)都請(qǐng)求狀態(tài)轉(zhuǎn)移,就像連接到集群之后一樣。 這樣,數(shù)據(jù)將保持一致狀態(tài)。 加起來 還值得注意的是,使用ScalaTest對(duì)ElasticMQ的復(fù)制進(jìn)行了全面測(cè)試。 每個(gè)測(cè)試都會(huì)創(chuàng)建一個(gè)內(nèi)存存儲(chǔ)集群,創(chuàng)建新節(jié)點(diǎn)或模擬節(jié)點(diǎn)崩潰。 請(qǐng)參見JGroupsReplicatedStorageTest類。 有了JGroups的機(jī)制,就可以輕松實(shí)現(xiàn)集群通信。 但是,與往常一樣,您需要記住一些有關(guān)并發(fā)的陷阱(例如,新節(jié)點(diǎn)加入時(shí)可能會(huì)有集群活動(dòng);分區(qū)和合并可能隨時(shí)發(fā)生;正常消息和集群視圖更改之間沒有順序) ;可以在狀態(tài)轉(zhuǎn)移期間發(fā)送消息;等等。 但是,JGroups 教程和手冊(cè)都非常全面,并且得到了論壇的其他幫助(感謝Bela!),您應(yīng)該一切順利。 您可以通過下載獨(dú)立的ElasticMQ 發(fā)行版或以嵌入式方式運(yùn)行它,來嘗試復(fù)制在實(shí)踐中的工作方式。 參考:來自Adam Warski博客的Blog的 JCG合作伙伴 Adam Warski使用JGroups在ElasticMQ中實(shí)現(xiàn)消息復(fù)制 。

翻譯自: https://www.javacodegeeks.com/2012/06/elasticmq-message-replication-with.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的使用JGroups进行ElasticMQ消息复制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。