一、概述
RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queuing Protocol)的開源實現。AMQP,即高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。
RabbitMQ是由RabbitMQ Technologies Ltd開發並且提供商業支持的。服務器端是用Erlang語言編寫,支持多種客戶端。用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面具有良好的表現。
二、應用場景
對於一個大型的軟件系統來說,它會有很多的組件或者說模塊或者說子系統或者(subsystem or Component or submodule)。那麼這些模塊的如何通信?這和傳統的IPC有很大的區別。傳統的IPC很多都是在單一系統上的,模塊耦合性很大,不適合擴展(Scalability);如果使用socket那麼不同的模塊的確可以部署到不同的機器上,但是還是有很多問題需要解決。比如:
1)信息的發送者和接收者如何維持這個連接,如果一方的連接中斷,這期間的數據如何方式丟失?
2)如何降低發送者和接收者的耦合度?
3)如何讓優先級高的接收者先接到數據?
4)如何做到負載均衡?有效均衡接收者的負載?
5)如何有效的將數據發送到相關的接收者?也就是說將接收者訂閱的不同數據,如何做有效的過濾。
6)如何做到可擴展,甚至將這個通信模塊發到cluster上?
7)如何保證接收者接收到了完整,正確的數據?
AMDQ協議解決了以上的問題,而RabbitMQ實現了AMQP。
三、服務結構
rabbitmq的框架如下:
幾點解釋:
rabbitmq server:是一種傳輸服務,維護從生產者到消費者的二路線,保證數據能按照指定方式進行傳輸。
clientA和clientB:即爲生產者,數據的發送方。有兩部分:payload(有效載荷)和label(標籤),payload是傳輸的數據,label是標籤,用於描述數據。而rabbitmq也是通過label來決定把信息發送給哪個消費者。
client1,client2,client3:即爲消費者,數據的接收方。當信息到達隊列之後,rabbitmq會依次發送給每一個訂閱此信息的消費者,發送給消費者時會刪掉信息的標籤,對消費者來說自己不知道誰發送的信息。特定情況比如發送的數據包含生產者的信息時另當別論。
數據從生產者到消費者的傳遞,有幾個概念:exchanges, queues和bindings。
Exchanges(交換器):是生產者發佈信息的地方,由exchange將消息路由到一個或多個隊列中。
queue(隊列):是rabbitmq的內部對象,用於存儲消息,rabbitmq中的消息都只能存儲在隊列中,生產者的消息最終都到queue中,消費者可根據訂閱從queue中獲取消息。
binding(綁定):通過binding將exchange和queue關聯起來,這樣rabbitmq就知道如何正確地將消息路由到指定的隊列了。
需要知道的兩個概念:
connection:生產者和消費者之間,使用TCP進行連接到rabbitmqserver的。
channels:虛擬連接,在TCP連接中,數據流是在channel中進行的。
四、應用安裝指南
安裝環境:CentOS6.8
4.1 安裝erlang
安裝rabbitmq需要先安裝erlang,erlang是一種解釋語言,可直接在rabbitmq官網中下載到(但可能不是最新版本)。地址: http://www.rabbitmq.com/releases/erlang/
wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm rpm -ivh erlang-19.0.4-1.el6.x86_64.rpm
4.2 安裝rabbitmq
導入rabbitmq公鑰
首先導入rabbitmq的公鑰,不安裝密鑰的話安裝rabbitmq會報錯
報錯:warning: rabbitmq-server-3.6.6-1.el6.noarch.rpm: Header V4 RSA/SHA1Signature, key ID 6026dfca: NOKEY
rpm --import http://www.rabbitmq.com/rabbitmq-release-signing-key.asc
安裝rabbitmq
下載地址:http://www.rabbitmq.com/releases/rabbitmq-server/
本次下載的是3.6.6版本
wget rpm -ivh rabbitmq-server-3.6.6-1.el6.noarch.rpm
安裝過程中可能會報錯,如:
error: Faileddependencies:
socat is needed byrabbitmq-server-3.6.6-1.el6.noarch
原因是缺少socat包,安裝即可(需要epel擴展源):
yum install socat
此次安裝使用的不是全新的系統,有部分相關包已經安裝完,故實際操作中根據實際問題安裝相應的依賴包。
配置變量
默認的變量可以在日誌裏查看到,日誌在/var/log/rabbitmq/下,有四個文件,查看[email protected]前面的幾行,有相關變量的說明,如:
node : rabbit@rabbit01
home dir : /var/lib/rabbitmq
config file(s) :/etc/rabbitmq/rabbitmq.config
cookie hash : +aRq6ISnMthDGwICCmjvGw==
log : /var/log/rabbitmq/[email protected]
sasl log : /var/log/rabbitmq/[email protected]
databasedir : /var/lib/rabbitmq/mnesia/rabbit@rabbit01
設置環境變量可以創建一個rabbitmq-env.conf文件,rabbitmq的環境變量都是有“RABBITMQ_”這樣的前綴的,在配置文件裏配置變量時要把前綴去掉,如:
#Rename the node
NODENAME=rabbit@rabbit01
#Config file location and new filename bunnies.config
CONFIG_FILE=/etc/rabbitmq/
一般情況,不需要設置環境變量,使用默認就可以,除非有非標準的需求。
配置文件
配置文件的示例文件在/usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example,可以拷貝到/etc/rabbitmq/下並改名將example去掉:
cp /usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
此配置文件的內容爲示例內容,可根據需求進行改動
相關參數可參考官方文檔:http://www.rabbitmq.com/configure.html#configuration-file
端口訪問設置
rabbitmq的端口比較多,系統的一些防護機制很可能會有影響,比如selinux,iptables等,以下端口是默認端口:
4369[empd]:是erlang集羣節點間端口映射的守護進程,負責維護集羣內的節點連接,提供節點名稱到IP地址及端口的解析服務。
5672, 5671:tcp和ssl的偵聽端口
25672:管理插件端口,默認是AMQP端口+20000
1883, 8883:如果MQTT啓用的話會用到此端口,MQTT(消息隊列遙測傳輸,是一個即時通訊協議)
系統層的參數修改
在生產上,可能會有大併發連接和隊列,使用系統默認的最大打開文件數可能不足以應付高併發,所以需要將最大打開文件數做修改,默認爲1024,可用ulimit -n查看,一般情況設置爲4096就足以滿足大多數工作負載:
ulimit -S -n 4096