作者簡歷目前任職於凌群電腦軟體事業群,主要專長為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安裝教學