消息隊列RabbitMQ入門與5種模式詳解

1.RabbitMQ概述

簡介

  • MQ全稱為Message Queue,消息隊列是應用程序和應用程序之間的通信方法;
  • RabbitMQ是開源的,實現(xiàn)了AMQP協(xié)議的,采用Erlang(面向并發(fā)編程語言)編寫的,可復用的企業(yè)級消息系統(tǒng);
  • AMQP(高級消息隊列協(xié)議)是一個異步消息傳遞所使用應用層協(xié)議規(guī)范,為面向消息中間件設計,基于此協(xié)議的客戶端與消息中間件可以無視消息來源傳遞消息,不受客戶端、消息中間件、不同的開發(fā)語言環(huán)境等條件的限制;
  • 支持主流操作系統(tǒng):Linux、Windows,MacOX等;
  • 支持多種客戶端開發(fā)語言:Java、Python、Ruby、.NET,PHP、C/C++、Node.js等

術語說明

  • Server(Broker):接收客戶端連接,實現(xiàn)AMQP協(xié)議的消息隊列和路由功能的進程;
  • Virtual Host:虛擬主機的概念,類似權限控制組,一個Virtual Host里可以有多個Exchange和Queue,權限控制的最小麗都是Virtual Host;
  • Exchange:交換機,接收生產者發(fā)送的消息,并根據(jù)Routing Key將消息路由到服務器中的隊列Queue。
  • ExchangeType:交換機類型決定了路由消息行為,RabbitMQ中有三種類型Exchange,分別是fanout、direct、topic;
  • Message Queue:消息隊列,用于存儲還未被消費者消費的消息;
  • Message:由Header和body組成,Header是由生產者添加的各種屬性的集合,包括Message是否被持久化、優(yōu)先級是多少、由哪個Message Queue接收等;body是真正需要發(fā)送的數(shù)據(jù)內容;
    BindingKey:綁定關鍵字,將一個特定的Exchange和一個特定的Queue綁定起來。

2.RabbitMQ安裝啟動與管理

2.1 Windows64位環(huán)境下安裝RabbitMQ

到RabbitMQ官網下載win64位最新版erlang和rabbitmq-server的安裝包,分別是 erlang otp_win64_19.3和rabbitmq-server-3.6.9。注意安裝時計算機全名最好是英文,先安裝erlang,再安裝rabbitmq-server,根據(jù)安裝向導,采用默認安裝配置即可。安裝完成后,可以從開始-所有程序中找到RabbitMQ Server如下圖所示:



點RabbitMQ Command Prompt啟動命令行,輸入rabbitmq-plugins enable rabbitmq_management



啟動管理工具,在瀏覽器中輸入http://127.0.0.1:15672/即可打開管理登錄界面,默認超級管理員用戶名guest,密碼guest

2.2 Linux環(huán)境下安裝RabbitMQ

先安裝Erlang
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc
sudo yum install erlang
再安裝RabbitMQ
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum install rabbitmq-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-plugins enable rabbitmq_management
service rabbitmq-server restart
防火墻開放15672端口訪問
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save


2.3RabbitMQ管理界面添加用戶和Virtual host

Admin-Users-Add a user

Add a user

Tags:用戶角色說明
** 超級管理員(administrator)**
可登陸管理控制臺,可查看所有的信息,并且可以對用戶,策略(policy)進行操作。
監(jiān)控者(monitoring)
可登陸管理控制臺,同時可以查看rabbitmq節(jié)點的相關信息(進程數(shù),內存使用情況,磁盤使用情況等)
策略制定者(policymaker)
可登陸管理控制臺, 同時可以對policy進行管理,但無法查看節(jié)點的相關信息。
普通管理者(management)
僅可登陸管理控制臺,無法看到節(jié)點信息,也無法對策略進行管理。
其他none
無法登陸管理控制臺,通常就是普通的生產者和消費者。
Admin-Virtual Host-Add virtual host
Admin-Virtual Host

添加virtual host和用戶后,需要為用戶指定virtual host,之后用該用戶可以登錄

3.RabbitMQ的五種隊列模式與實例

3.1 簡單模式Hello World

簡單模式Hello World

功能:一個生產者P發(fā)送消息到隊列Q,一個消費者C接收
生產者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,使用通道channel向隊列中發(fā)送消息,關閉通道和連接。
生產者實現(xiàn)思路

消費者實現(xiàn)思路
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue, 創(chuàng)建消費者并監(jiān)聽隊列,從隊列中讀取消息。
消費者實現(xiàn)思路


3.2 工作隊列模式Work Queue

工作隊列模式Work Queue

功能:一個生產者,多個消費者,每個消費者獲取到的消息唯一,多個消費者只有一個隊列
任務隊列:避免立即做一個資源密集型任務,必須等待它完成,而是把這個任務安排到稍后再做。我們將任務封裝為消息并將其發(fā)送給隊列。后臺運行的工作進程將彈出任務并最終執(zhí)行作業(yè)。當有多個worker同時運行時,任務將在它們之間共享。
生產者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,使用通道channel向隊列中發(fā)送消息,2條消息之間間隔一定時間,關閉通道和連接。
生產者實現(xiàn)思路

消費者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,創(chuàng)建消費者C1并監(jiān)聽隊列,獲取消息并暫停10ms,另外一個消費者C2暫停1000ms,由于消費者C1消費速度快,所以C1可以執(zhí)行更多的任務。
消費者實現(xiàn)思路


3.3發(fā)布/訂閱模式 Publish/Subscribe

發(fā)布/訂閱模式 Publish/Subscribe

功能:一個生產者發(fā)送的消息會被多個消費者獲取。一個生產者、一個交換機、多個隊列、多個消費者
生產者:可以將消息發(fā)送到隊列或者是交換機。
消費者:只能從隊列中獲取消息。
如果消息發(fā)送到沒有隊列綁定的交換機上,那么消息將丟失。
交換機不能存儲消息,消息存儲在隊列中
生產者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,使用通道channel創(chuàng)建交換機并指定交換機類型為fanout,使用通道向交換機發(fā)送消息,關閉通道和連接。
生產者實現(xiàn)思路

消費者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,綁定隊列到交換機,設置Qos=1,創(chuàng)建消費者并監(jiān)聽隊列,使用手動方式返回完成。可以有多個隊列綁定到交換機,多個消費者進行監(jiān)聽。
消費者實現(xiàn)思路


3.4路由模式Routing

路由模式Routing

說明:生產者發(fā)送消息到交換機并且要指定路由key,消費者將隊列綁定到交換機時需要指定路由key
生產者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,使用通道channel創(chuàng)建交換機并指定交換機類型為direct,使用通道向交換機發(fā)送消息并指定key=b,關閉通道和連接。
生產者實現(xiàn)思路

消費者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,綁定隊列到交換機,設置Qos=1,創(chuàng)建消費者并監(jiān)聽隊列,使用手動方式返回完成。可以有多個隊列綁定到交換機,但只要綁定key=b的隊列key接收到消息,多個消費者進行監(jiān)聽。
消費者實現(xiàn)思路


3.5通配符模式Topic

通配符模式Topic

說明:生產者P發(fā)送消息到交換機X,type=topic,交換機根據(jù)綁定隊列的routing key的值進行通配符匹配;
符號#:匹配一個或者多個詞 lazy.# 可以匹配 lazy.irs或者lazy.irs.cor
符號*:只能匹配一個詞 lazy.* 可以匹配 lazy.irs或者lazy.cor
生產者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,使用通道channel創(chuàng)建交換機并指定交換機類型為topic,使用通道向交換機發(fā)送消息并指定key=key.1,關閉通道和連接。
生產者實現(xiàn)思路

消費者實現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設置服務地址127.0.0.1,端口號5672,設置用戶名、密碼、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊列queue,綁定隊列到交換機,設置Qos=1,創(chuàng)建消費者并監(jiān)聽隊列,使用手動方式返回完成。可以有多個隊列綁定到交換機,凡是綁定規(guī)則符合通配符規(guī)則的隊列均可以接收到消息,比如key.*,key.#,多個消費者進行監(jiān)聽。
消費者實現(xiàn)思路

4.Spring集成RabbitMQ配置

Spring提供了AMQP的一個實現(xiàn),并且spring-rabbit是RabbitMQ的一個實現(xiàn),下面給出訂閱者模式的事例配置如下:


Spring集成RabbitMQ配置

5.總結

RabbitMQ提供6種模式,分別是Hello,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文詳細講述了前5種,并給出代碼實現(xiàn)和思路。其中Publish/Subscribe,Routing,Topics三種模式可以統(tǒng)一歸為Exchange模式,只是創(chuàng)建時交換機的類型不一樣,分別是fanout、direct、topic。Spring提供了rabbitmq的一個實現(xiàn),所以集成起來很方便,本文第4章給出了訂閱者模式的一種spring配置。

本訂閱號提供Java相關技術分享,從Java編程基礎到Java高級技術,從JavaWeb技術基礎Jsp、Servlet、>JDBC到SSH、SSM開發(fā)框架,從REST風格接口設計到分布式項目實戰(zhàn)。剖析主流開源技術框架,用親身
實踐來譜寫深度Java技術日志。

Java技術日志

歡迎關注 Java技術日志 微信訂閱號

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 來源 RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務器。支持消息的持久化、事務、擁塞控...
    jiangmo閱讀 10,374評論 2 34
  • 關于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術選型,是時...
    預流閱讀 585,195評論 51 786
  • 1. 歷史 RabbitMQ是一個由erlang開發(fā)的AMQP(Advanced Message Queue )的...
    高廣超閱讀 6,105評論 3 51
  • 1 RabbitMQ安裝部署 這里是ErLang環(huán)境的下載地址http://www.erlang.org/down...
    Bobby0322閱讀 2,248評論 0 11