RabbitMQ入門與訊息佇列模式詳解
1.RabbitMQ概述
簡介
- MQ全稱為Message Queue,訊息佇列是應用程式和應用程式之間的通訊方法;
- RabbitMQ是開源的,實現了AMQP協議的,採用Erlang(面向併發程式語言)編寫的,可複用的企業級訊息系統;
- AMQP(高階訊息佇列協議)是一個非同步訊息傳遞所使用應用層協議規範,為面向訊息中介軟體設計,基於此協議的客戶端與訊息中介軟體可以無視訊息來源傳遞訊息,不受客戶端、訊息中介軟體、不同的開發語言環境等條件的限制;
- 支援主流作業系統:Linux、Windows,MacOX等;
- 支援多種客戶端開發語言:Java、Python、Ruby、.NET,PHP、C/C++、Node.js等
術語
- Server(Broker):接收客戶端連線,實現AMQP協議的訊息佇列和路由功能的程序;
- Virtual Host:虛擬主機的概念,類似許可權控制組,一個Virtual Host裡可以有多個Exchange和Queue,許可權控制的最小麗都是Virtual Host;
- Exchange:交換機,接收生產者傳送的訊息,並根據Routing Key將訊息路由到伺服器中的佇列Queue。
- ExchangeType:交換機型別決定了路由訊息行為,RabbitMQ中有三種類型Exchange,分別是fanout、direct、topic;
- Message Queue:訊息佇列,用於儲存還未被消費者消費的訊息;
- Message:由Header和body組成,Header是由生產者新增的各種屬性的集合,包括Message是否被持久化、優先順序是多少、由哪個Message Queue接收等;body是真正需要傳送的資料內容;
- BindingKey:繫結關鍵字,將一個特定的Exchange和一個特定的Queue繫結起來。
2.RabbitMQ安裝啟動與管理
2.1 Windows64環境下安裝RabbitMQ
到RabbitMQ官網下載win64位最新版erlang和rabbitmq-server的安裝包,分別是 erlangotp_win64_19.3和rabbitmq-server-3.6.9。注意安裝時計算機全名最好是英文,先安裝erlang,再安裝rabbitmq-server,根據安裝嚮導,採用預設安裝配置即可。安裝完成後,可以從開始-所有程式中找到RabbitMQ Server如下圖所示:
點RabbitMQ Command Prompt啟動命令列,輸入rabbitmq-plugins enablerabbitmq_management
啟動管理工具,在瀏覽器中輸入http://127.0.0.1:15672/即可開啟管理登入介面,預設超級管理員使用者名稱guest,密碼guest
2.2 Linux下安裝RabbitMQ
先安裝Erlang
rpm -Uvherlang-solutions-1.0-1.noarch.rpm
sudo yuminstall erlang
再安裝RabbitMQ
rpm --importhttps://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum installrabbitmq-server-3.6.9-1.noarch.rpm
操作命令:
啟動 service rabbitmq-server start
停止 service rabbitmq-server stop
重啟 service rabbitmq-server restart
設定開機啟動 chkconfig rabbitmq-server on
開啟web介面管理工具
rabbitmq-pluginsenable rabbitmq_management
service rabbitmq-serverrestart
防火牆開放15672埠訪問
/sbin/iptables-I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptablessave
2.3 RabbitMQ新增使用者和Virtual Host
Admin-Users-Add a user
Tags:使用者角色說明
超級管理員(administrator)
可登陸管理控制檯,可檢視所有的資訊,並且可以對使用者,策略(policy)進行操作。
監控者(monitoring)
可登陸管理控制檯,同時可以檢視rabbitmq節點的相關資訊(程序數,記憶體使用情況,磁碟使用情況等)
策略制定者(policymaker)
可登陸管理控制檯, 同時可以對policy進行管理,但無法檢視節點的相關資訊。
普通管理者(management)
僅可登陸管理控制檯,無法看到節點資訊,也無法對策略進行管理。
其他none
無法登陸管理控制檯,通常就是普通的生產者和消費者。
Admin-Virtual Host-Add virtual host
新增virtual host和使用者後,需要為使用者指定virtual host,之後用該使用者可以登入
3.RabbitMQ的5種模式與例項
3.1 簡單模式Hello World
功能:一個生產者P傳送訊息到佇列Q,一個消費者C接收
生產者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel向佇列中傳送訊息,關閉通道和連線。
消費者實現思路
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue, 建立消費者並監聽佇列,從佇列中讀取訊息。
3.2 工作佇列模式Work Queue
功能:一個生產者,多個消費者,每個消費者獲取到的訊息唯一,多個消費者只有一個佇列
任務佇列:避免立即做一個資源密集型任務,必須等待它完成,而是把這個任務安排到稍後再做。我們將任務封裝為訊息並將其傳送給佇列。後臺執行的工作程序將彈出任務並最終執行作業。當有多個worker同時執行時,任務將在它們之間共享。
生產者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel向佇列中傳送訊息,2條訊息之間間隔一定時間,關閉通道和連線。
消費者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,建立消費者C1並監聽佇列,獲取訊息並暫停10ms,另外一個消費者C2暫停1000ms,由於消費者C1消費速度快,所以C1可以執行更多的任務。
3.3 釋出/訂閱模式Publish/Subscribe
功能:一個生產者傳送的訊息會被多個消費者獲取。一個生產者、一個交換機、多個佇列、多個消費者
生產者:可以將訊息傳送到佇列或者是交換機。
消費者:只能從佇列中獲取訊息。
如果訊息傳送到沒有佇列繫結的交換機上,那麼訊息將丟失。
交換機不能儲存訊息,訊息儲存在佇列中
生產者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel建立交換機並指定交換機型別為fanout,使用通道向交換機發送訊息,關閉通道和連線。
消費者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,繫結佇列到交換機,設定Qos=1,建立消費者並監聽佇列,使用手動方式返回完成。可以有多個佇列繫結到交換機,多個消費者進行監聽。
3.4 路由模式Routing
說明:生產者傳送訊息到交換機並且要指定路由key,消費者將佇列繫結到交換機時需要指定路由key
生產者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel建立交換機並指定交換機型別為direct,使用通道向交換機發送訊息並指定key=b,關閉通道和連線。
消費者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,繫結佇列到交換機,設定Qos=1,建立消費者並監聽佇列,使用手動方式返回完成。可以有多個佇列繫結到交換機,但只要繫結key=b的佇列key接收到訊息,多個消費者進行監聽。
3.5 萬用字元模式Topics
說明:生產者P傳送訊息到交換機X,type=topic,交換機根據繫結佇列的routing key的值進行萬用字元匹配;符號#:匹配一個或者多個詞lazy.# 可以匹配lazy.irs或者lazy.irs.cor
符號*:只能匹配一個詞lazy.* 可以匹配lazy.irs或者lazy.cor
生產者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,使用通道channel建立交換機並指定交換機型別為topic,使用通道向交換機發送訊息並指定key=key.1,關閉通道和連線。
消費者實現思路:
建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連線connection,使用連線建立通道channel,使用通道channel建立佇列queue,繫結佇列到交換機,設定Qos=1,建立消費者並監聽佇列,使用手動方式返回完成。可以有多個佇列繫結到交換機,凡是繫結規則符合萬用字元規則的佇列均可以接收到訊息,比如key.*,key.#,多個消費者進行監聽。
4.spring整合rabbitmq配置
Spring提供了AMQP的一個實現,並且spring-rabbit是RabbitMQ的一個實現,下面給出訂閱者模式的事例配置如下:
5.總結
RabbitMQ提供了6種模式,分別是HelloWorld,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文詳細講述了前5種,並給出程式碼實現和思路。其中Publish/Subscribe,Routing,Topics三種模式可以統一歸為Exchange模式,只是建立時交換機的型別不一樣,分別是fanout、direct、topic。Spring提供了rabbitmq的一個實現,所以整合起來很方便,文章第4章給出了訂閱者模式的一種spring配置。
歡迎大家關注博主訂閱號“Java技術日誌”,提供Java相關技術分享,從Java程式設計基礎到Java高階技術,從JavaWeb技術基礎Jsp、Servlet、JDBC到SSH、SSM開發框架,從REST風格介面設計到分散式專案實戰。剖析主流開源技術框架,用親身實踐來譜寫深度Java技術日誌。
Java技術日誌
歡迎加入QQ群:Java技術交流群 326303715