RabbitMQ是部署最廣泛的開源消息代理。
RabbitMQ在全球範圍內在小型初創公司和大型企業中進行了超過35,000次RabbitMQ生產部署,是最受歡迎的開源消息代理。
RabbitMQ輕量級,易於在內部和雲中部署。它支持多種消息傳遞協議。RabbitMQ可以部署在分佈式和聯合配置中,以滿足高規模,高可用性要求。
RabbitMQ可在許多操作系統和雲環境中運行,併爲大多數流行語言提供各種開發人員工具。
RabbitMQ是一個在AMQP基礎上完成的,可複用的企業消息系統。它是由Erlang語言開發。
AMQP:Advanced Message Queue,高級消息隊列協議。他是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。
RabbitMQ 最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。具體特點包括:<!--more--> 可靠性(Reliability):RabbitMQ使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。 靈活的路由(Flexible Routing):在消息進入隊列之前,通過 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 提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件。
概念
Broker:消息隊列服務器的實體,是一箇中間件應用,負責接收消息生產者的消息,然後將消息發送至消息接收者或其他的Braker Exchange:消息交換機,是消息第一個到達的地方,消息通過它指定的路由規則,分發到不同的消息隊列中去。 Queue:消息隊列,消息通過發送和路由之後最終達到的地方,到達Queue的消息即進入邏輯上等待消費的狀態。每個消息都會被髮送到一個或多個隊列。 Binding:綁定,它的作用就是把Exchange和Queue按照路由規則綁定起來,也就是Exchange和Queue之間的虛擬鏈接。 Routing Key:路由關鍵字,Exchange根據這個關鍵字進行消息投遞。 Virtual host:虛擬主機,是對Broker的虛擬劃分,將消費者、生產者和它們依賴的AMQP相關結構進行隔離,一般都是爲了安全考慮。比如:我們可以在一個Broker中設置多個虛擬主機,對不同用戶進行權限的分離。 Connection:連接。代表生產者、消費者、Broker之間進行通信的物理網絡。 Channel:消息通道,用於連接生產者和消費者的邏輯結構。在客戶端每個連接裏,可建立多個Channel,每個Channel代表一個會話任務,通過Channel可以隔離同一個連接中的不同交互內容。 Producer:消息生產者。 Consumer:消息消費者。
消息隊列的使用過程:
- 客戶端連接到消息隊列服務器,打開一個channel。
- 客戶端聲明一個exchange,並設置相關屬性。
- 客戶端聲明一個queue,並設置相關屬性。
- 客戶端使用routing key,在exchange和queue之間建立好綁定關係。
- 客戶端投遞消息到exchange。
安裝介紹
Erlang安裝配置
前面說到RabbitMQ是由Erlang語言開發,所以需要先安裝Erlang環境
最簡化安裝
配置好 yum倉庫,epel源
yum install erlang
下載好後檢測erlang
[root@lb01 yum.repos.d]# which erl /usr/bin/erl
RabbitMQ安裝
最簡化安裝
yum install rabbitmq-server
檢測是否安裝
[root@lb01 yum.repos.d]# rabbitmq rabbitmqctl rabbitmq-plugins rabbitmq-server
RabbitMQ服務命令
#啓動服務 rabbitmq-server -detached #查看幫助 man rabbitmq-server 參數解釋: OPTIONS -detached 後臺運行 Start the server process in the background. Note that this will cause the pid not to be written to the pid file. rabbitmqctl status #查看rabbitmq狀態 #創建rabbitmq登錄用戶 添加用戶 rabbitmqctl add_user [username] [password] 添加權限 rabbitmqctl set_permissions -p "/" [username] ".*" ".*" ".*" 修改用戶角色 rabbitmqctl set_user_tags [username] administrator
配置rabbitmq網頁插件
RabbitMQ網頁管理的端口是15672,但是現在還不能訪問,需要添加網頁插件才能訪問 rabbitmq-plugins enable rabbitmq_management
啓動Rabbitmq服務
rabbitmq-server -detached
啓動之後檢查rabbitmq端口狀態
[root@web01 /etc/yum.repos.d]$netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1217/master tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 12930/beam.smp tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 10851/epmd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 953/sshd tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 12930/beam.smp #rabbitmq web界面端口 tcp6 0 0 ::1:25 :::* LISTEN 1217/master tcp6 0 0 :::5672 :::* LISTEN 12930/beam.smp tcp6 0 0 :::3306 :::* LISTEN 1039/mysqld tcp6 0 0 :::4369 :::* LISTEN 10851/epmd tcp6 0 0 :::22 :::* LISTEN 953/sshd udp 0 0 127.0.0.1:323 0.0.0.0:* 695/chronyd udp6 0 0 ::1:323 :::* 695/chronyd
rabbitmq啓動端口號解析
4369 (epmd), 25672 (Erlang distribution) Epmd 是 Erlang Port Mapper Daemon 的縮寫,在 Erlang 集羣中相當於 dns 的作用,綁定在4369端口上。 5672, 5671 (AMQP 0-9-1 without and with TLS) AMQP 是 Advanced Message Queuing Protocol 的縮寫,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,專爲面向消息的中間件設計。 基於此協議的客戶端與消息中間件之間可以傳遞消息,並不受客戶端/中間件不同產品、不同的開發語言等條件的限制。Erlang 中的實現有 RabbitMQ 等。 15672 (if management plugin is enabled) 通過 http://serverip:15672 訪問 RabbitMQ 的 Web 管理界面,默認用戶名密碼都是 guest。(注意:RabbitMQ 3.0之前的版本默認端口是55672,下同) 61613, 61614 (if STOMP is enabled) Stomp 是一個簡單的消息文本協議,它的設計核心理念就是簡單與可用性,官方文檔,實踐一下 Stomp 協議需要: 一個支持 stomp 消息協議的 messaging server (譬如activemq,rabbitmq); 一個終端(譬如linux shell); 一些基本命令與操作(譬如nc,telnet) 1883, 8883 (if MQTT is enabled) MQTT 只是 IBM 推出的一個消息協議,基於 TCP/IP 的。兩個 App 端發送和接收消息需要中間人,這個中間人就是消息服務器(比如ActiveMQ/RabbitMQ),三者通信協議就是 MQTT
創建root用戶用於登錄
[root@web01 /etc/yum.repos.d]$rabbitmqctl add_user root redhat Creating user "root" ... ...done.
修改root用戶角色權限
第二、添加root用戶爲administrator角色 [root@web01 /etc/yum.repos.d]$rabbitmqctl set_user_tags root administrator Setting tags for user "root" to [administrator] ... ...done.
設置root用戶權限,允許訪問的vhost以及配置、寫、讀的權限
[root@web01 /etc/yum.repos.d]$rabbitmqctl set_permissions -p "/" root ".*" ".*" ".*" Setting permissions for user "root" in vhost "/" ... ...done.
檢查vhost / 允許哪些用戶訪問
[root@web01 /etc/yum.repos.d]$rabbitmqctl list_permissions -p / Listing permissions in vhost "/" ... guest .* .* .* root .* .* .* ...done.
登錄rabbitmq web界面
Python操作RabbitMQ
import pika #創建用戶憑證,確認賬號密碼 credentials = pika.PlainCredentials('root', 'redhat') #創建連接 connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.119.11', port=5672, virtual_host='/', credentials=credentials)) #創建頻道連接 channel = connection.channel() #打印頻道信息,是否創建ok print(channel) #通過此頻道可以創建隊列