使用JGroups進行ElasticMQ消息復制

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372446.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ajax省市二級聯動硬編碼,AJAX請求接受硬編碼的JSON,但不接受軟編碼

這個AJAX請求返回'成功'如果PHP中的輸出被復制并粘貼了JSON,但是'失敗'如果它是由文件生成的。看看下面api.php中的評論,看看我的意思。$.aj…

Fiddler高級技巧 - 映射路徑到本地文件夾

適用場景: 你是前端開發人員,要開發一個小模塊,需要用到線上的環境(賬號、數據、跨域等),但你又沒有權限往線上傳文件你是移動測試人員,需要將一組接口的返回結果替換為另一組,最簡單…

Spring Social入門

像我一樣,無論是添加簡單的Facebook“贊”按鈕,一大堆“共享”按鈕還是顯示時間軸信息,您都不會注意到當前對應用程序“社交化”的熱衷。 每個人都在做這件事,包括Spring的家伙,事實上,他們提供了一個稱為S…

apache ajax 跨域訪問,Apache 實現AJAX跨域請求

當使用ajax跨域請求時,瀏覽器報錯:XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin.肯定是跨域的問題,如果用jsonp或者pro更多:當使用ajax跨域請求時,瀏覽器報錯:XmlHtt…

14、數據庫

數據庫轉載于:https://www.cnblogs.com/quyong/p/6687924.html

EhCache復制:RMI與JGroups

最近,我正在研究一種需要復制緩存的產品。 緩存提供程序已經確定-EhCache,剩下的就是有關傳輸的問題。 哪一個是最佳選擇? 這里的最佳選擇是指性能更好的選擇。 僅在兩個可用傳輸之間進行了性能評估-JGroups和RMI,對其他傳輸不予考…

Oracle 監控語句整理(包括TOP SQL等)

希望能對大家有所幫助! 很多時候大家想查看oracle數據庫中的sql語句執行情況,但是又不知道如何是好,今天在這里為大家提供一個sql語句,大家可以通過以下的sql語句查詢Oracle數據庫中Top Sql情況: 查詢結果可按照PCT、總…

服務器wifi無線放大器,一回家WiFi信號太弱?教你用兩毛錢制作信號放大器

原標題:一回家WiFi信號太弱?教你用兩毛錢制作信號放大器現在家家戶戶都有無線路由器,但是大部分人都還是早期的單天線產品,信號覆蓋范圍比較小,特別是穿墻性能不行。人在客廳WiFi信號還滿格,一到臥室就瞬間…

iOS開發 之 可穿戴設備 藍牙4.0 BLE 開發

1 前言 當前有越來越多的可穿戴設備使用了藍牙4.0 BLE(Bluetooth Low Energy)。對于iOS開發而言,Apple之前專門推出CoreBluetooth的Framework來支持BLE的開發。對于硬件開發有了解的朋友應該知道,在之前使用低版本的藍牙的設備,要…

將Java服務公開為Web服務

本教程解決了開發人員面臨的最實際的情況。 大多數時候,我們可能需要將某些現有服務公開為Web服務。 在項目生命周期的不同階段可能會遇到這種情況。 如果這是初始階段,那么您幾乎是安全的,您可以為此做好充分的準備。 但是,將要發…

git服務器維護 備份,gitlab服務運維,備份與恢復 - 橙子檸檬's Blog

gitlab服務運維工作Gitlab-ctl 使用gitlab-ctl start #啟動服務gitlab-ctl stop #停止服務gitlab-ctl restart #重啟服務檢查服務的日志信息gitlab-ctl tail redis #檢查redis的日志gitlab-ctl tail postgresql #…

angular js實現開關效果

功能:實現點擊排序,再點擊排倒序。 實現方法如下 方法一:定義變量實現點擊切換true或false,代碼為: $scope.lidata [ {"name":"Terry","age":12}, {&qu…

使用TestNG的彈簧測試支持

TestNG是一個測試框架,旨在涵蓋所有類別的測試:單元,功能,端到端,集成等。 它包括許多功能,例如靈活的測試配置,對數據驅動測試的支持(使用DataProvider),強大…

Entity Framework - 理清關系 - 基于外鍵關聯的單向一對一關系

注:本文針對的是 Entity Framework Code First 場景。 之前寫過三篇文章試圖理清Entity Framework中的一對一關系(單相思(單向一對一), 兩情相悅(雙向一對一), 兩情相悅-續),但當時理…

微信社交小程序服務器,Day12-微信小程序實戰-交友小程序-搭建服務器與上傳文件到后端...

要搞一個小型的cms內容發布系統因為小程序上線之后,直接對數據庫進行操作的話,慧出問題的,所以一般都會做一個管理系統,讓工作人員通過這個管理系統來對這個數據庫進行增刪改查微信小程序其實給我們提供了這樣的能力了(也就是可以…

java go

熟練掌握java技術,對多線程、數據結構有清晰的認識; 熟悉MySQL/Oracle數據庫,熟悉關系數據庫應用設計開發; 熟悉Spring/MyBatis/Freemarker等一種或者多種框架; java基礎扎實,熟練掌握目前主流的開源框架&a…

了解如何解決OSGI捆綁包

我想回顧一下OSGI包如何解決并使用Apache Karaf進行演示。 Karaf是基于Apache Felix內核的功能齊全的OSGI容器,并且是Apache ServiceMix集成容器的基石。 對于第一部分,我將討論OSGI框架如何解決捆綁包。 在第二部分中,我將使用Apache Karaf演…

文件共享服務器imac,iMac怎么在網絡上共享設備windows文件夾和服務 | MOS86

本章通過向您展示如何在網絡和Mac和Windows計算機之間共享文件,文件夾和設備,幫助您充分利用您的iMac網絡連接。→使用Macs共享文件和文件夾使用AirDrop和文件共享→與Windows 7計算機共享文件→設置共享權限→使用共享表快速在線共享文件→共享和訪問網…

【轉】 簡單理解Socket

題外話 前幾天和朋友聊天,朋友問我怎么最近不寫博客了,一個是因為最近在忙著公司使用的一些控件的開發,瀏覽器兼容性搞死人;但主要是因為這段時間一直在看html5的東西,看到web socket時覺得很有意思,動手寫…

.NET基礎

.NET C# ASP.NET關系:.NET是一個平臺,提供程序運行的虛擬機環境和類庫。 C#是.Net平臺上的一種語言,其他語言還有VB.NET PowerShell等。 ASP.NET是在.NET下的網站開發技術。 安裝.NET FrameWork就可以運行。VS集成安裝了.NET FrameWork. 控制…