第256期 / February 1, 2019

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

RabbitMQ簡介與實作

作者/林晉玄

[發表日期:2018/12/5]

作者簡歷

目前任職於凌群電腦軟體事業群,主要專長為JAVA語言、Javascript、資料庫、Servlet/JSP、jQuery。曾於本公司為客戶專案(專案:內政部警政署「106年度雲端專案」中導入Servlet/JSP、JAVA、Javascript 、jQuery等相關技術,並採AJAX來執行動態效果與非同步資料交換),協助為此專案修改、開發第三、四級毒品行政系統網頁,使本案能順利進行

序論

RabbitMQ是實現AMQP(Advanced Message Queuing Protocol,進階訊息佇列協議) 中間件設計的一種。伺服器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,亦支持AJAX。用於在分布式系統中存儲轉發訊息,在易用性、擴展性、高可用性等方面表現不俗。

基本概念

下圖為整個RabbitMQ基本架構


《圖一》


一個Publisher(server)發出訊息時會先將訊息傳送到Exchange,此時Exchange會將訊息外包一層規則(Binding)並傳送到Queue,在規則中,可以決定該訊息由誰來取走,而Queue則負責保存這些訊息,直到Consumer透過Channel將訊息取走(一個Consumer就是一條Channel)。

安裝ERLANG

一、先到官網安裝ERLANG http://www.erlang.org/downloads


《圖二》視作業系統選擇下載的版本,筆者作業系統是Win10 64位元故選擇如圖


二、以管理員身分安裝

三、安裝完成之後設定環境變數 (在系統變數中先新增一個環境變數ERLANG_HOME路徑為X:\...\erl9.2,之後在Path中再新增路徑%ERLANG_HOME%\bin與%ERLANG_HOME%\bin\erl.exe)



《圖三》


《圖四》


《圖五》


《圖六》


《圖七》


四、開啟CMD 輸入erl查看是否設定成功,若出現如下圖就表示安裝成功


《圖八》


安裝RabbitMQ

一、先到官網下載並以系統管理員身分安裝RabbitMQ http://www.rabbitmq.com/install-windows.html


《圖九》


二、安裝完後,設定環境變數(先新增一個RABBITMQ_BASE環境變數,路徑為X:\...\rabbitmq_server-3.7.7,在Path新增路徑%RABBITMQ_BASE%\sbin)


《圖十》



《圖十一》


三、同步Erlang Cookie

要確保Erlang cookie檔包含相同的字串(因為Erlang cookie檔在不同路徑下被服務和使用者使用),請從Windows目錄(通常為C:\ WINDOWS \ .erlang.cookie)複製.erlang.cookie檔以替換使用者目錄中.erlang.cookie。
eg: C:\Windows\System32\config\systemprofile.erlang.cookie替換掉C:\Users\User\.erlang.cookie

四、開啟CMD(以管理員身分開啟)輸入 rabbitmqctl status 可察看目前rabbitmq的狀態

五、開啟CMD (以管理員身分開啟)先輸入rabbitmqctl stop 關閉rabbitmq



《圖十二》


再輸入rabbitmq-plugins.bat enable rabbitmq_management 啟用管理套件


《圖十三》


完成以後再輸入rabbitmq-server start開啟rabbitmq

六、啟動完之後可以開啟瀏覽器輸入 http://localhost:15672/ ,開啟管理介面,預設帳號密碼是:guest/guest,下圖為登入之後的畫面


《圖十四》


建立RabbitMQ Cluster(以下動作皆在client端執行)

要從server端傳送訊息給client端需要將client端都加入server端所在的同一個Cluster中
註:每一台皆須透過上述步驟安裝ERLANG與RabbitMQ方可使用
(為方便使用,以下兩個client端接再VM Win7 64位元環境下執行)

一、stop service


《圖十五》


二、改 cookie,為了讓各組 RabbitMQ 可以認識彼此,請選定其中一組 RabbitMQ(server端) 將其 cookie 複製至其他 RabbitMQ (client端)中使用, 同 安裝RabbitMQ之步驟三須將每一台server上的C:\Windows\System32\config\systemprofile\.erlang.cookie與C:\Users\User\.erlang.cookie 當放入相同的檔案

三、restart service



《圖十六》


四、停止 RabbitMQ,開啟CMD輸入rabbitmqctl stop_app


《圖十七》



《圖十八》


五、加入 Cluster,將該 client端的rabbitmq 加至 server端 的 cluster 中,rabbitmqctl join_cluster rabbit@{MACHINENAME},{MACHINENAME}為server的電腦名稱


《圖十九》


備註:在每一台server上請記得將erl相關執行檔與port加入防火牆白名單


《圖二十》



《圖二十一》


六、重啟 RabbitMQ,在CMD輸入rabbitmqctl start_app


《圖二十二》



《圖二十三》


七、在http://localhost:15672/ 可看到設定成功


《圖二十四》


以上就完成了server與client端cluster的設定囉!
接下來就可以進入程式的部分了

八、Rabbitmq設定連線


《圖二十五》


備註:username與password預設是guest/guest(這組只能在localhost使用),若要從client端與server端連結需要在server端新增一組擁有admin權限的帳號給連入的client端使用,範例如下

新增 RabbitMQ user test/test ,並且把 test 加入管理員權限
1.開啟CMD(以管理員權限) 輸入 rabbitmqctl add_user test test
2.rabbitmqctl set_user_tags test administrator
3.rabbitmqctl set_permissions -p / test ".*" ".*" ".*"


《圖二十六》


JAVA範例

一、根據上述步驟將本機(GA-220604-NB-01)與兩台VM(A01 &A02)串為一個cluster


《圖二十七》


二、在server端執行EmitLogDirect.java模擬direct方式之推播功能(可推播三種類型之訊息:info、error、warn),兩台client端則執行ReceiveLogsDirect.java模擬接收端,並且在兩台設定接收不同類型的訊息(A01: info,A02: warn、error)

server端:建立連線

《圖二十八》


server端:傳送訊息,severity為訊息的類型(可自行定義),這邊定為info、warn、error三種,message則為訊息內容

《圖二十九》


本機端執行EmitLogDirect.java,輸入數字以送出不同訊息


《圖三十》


兩台VM則執行ReceiveLogsDirect.java,等待接收本機端送出的訊息
先建立連線,設定exchange type為direct


《圖三十一》


接下來兩台client分別設定接收不同類型的訊息
A01:設定接收info


《圖三十二》


A02:設定接收warn與error


《圖三十三》


好了之後就執行


《圖三十四》


三、本機端依序推播info、warn、error的訊息


《圖三十五》


在A01的虛擬機上可以看到接收到了info類型的訊息並顯示其內容


《圖三十六》


在A02的虛擬機上可看到接收到了warn、error類型的訊息,並也分別顯示其內容


《圖三十七》


在http://localhost:15672/#/ 也可以看到目前系統傳送與接收訊息的狀態


《圖三十八》


系統特點

一、可靠性(Reliability)

RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認

二、靈活的路由(Flexible Routing)

在訊息進入佇列之前,通過 Exchange 來路由訊息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現。針對更複雜的路由功能,可以將多個 Exchange 綁定在一起,也通過外掛程式機制實現自己的 Exchange

三、訊息集群(Clustering)

多個 RabbitMQ 伺服器可以組成一個集群,形成一個邏輯 Broker

四、高可用(Highly Available Queues)

佇列可以在集群中的機器上進行鏡像,使得在部分節點出問題的情況下佇列仍然可用

五、多種協定(Multi-protocol)

RabbitMQ 支援多種訊息佇列協定,比如 STOMP、MQTT 等等

六、多語言用戶端(Many Clients)

RabbitMQ 幾乎支援所有常用語言,比如 Java、.NET、Ruby 等等

七、管理介面(Management UI)

RabbitMQ 提供了一個易用的使用者介面,使得使用者可以監控和管理訊息 Broker 的許多方面

八、跟蹤機制(Tracing)

如果訊息異常,RabbitMQ 提供了訊息跟蹤機制,使用者可以找出發生了什麼

九、外掛程式機制(Plugin System)

RabbitMQ 提供了許多外掛程式,來從多方面進行擴展,也可以編寫自己的外掛程式

結論

在訊息的推播、控制,使用RabbitMQ可以很簡單的做到,這在許多系統上,例如線上遊戲、即時訊息APP等,會用到大量即時訊息推播的軟體上是有很大的幫助,不僅可以達到快速、即時,更可以監控訊息傳送的狀態,儘管碰到問題也能很快地找出問題點,因此RabbitMQ可算是未來訊息傳送技術重要發展之一。

參考資料

1.官網
2.RabbitMQ簡介
3.RabbitMQ安裝教學