消息隊(duì)列RabbitMQ入門與5種模式詳解

1.RabbitMQ概述

簡(jiǎn)介

  • MQ全稱為Message Queue入撒,消息隊(duì)列是應(yīng)用程序和應(yīng)用程序之間的通信方法秽浇;
  • RabbitMQ是開源的狂芋,實(shí)現(xiàn)了AMQP協(xié)議的哄孤,采用Erlang(面向并發(fā)編程語言)編寫的,可復(fù)用的企業(yè)級(jí)消息系統(tǒng)噪猾;
  • AMQP(高級(jí)消息隊(duì)列協(xié)議)是一個(gè)異步消息傳遞所使用應(yīng)用層協(xié)議規(guī)范阻塑,為面向消息中間件設(shè)計(jì)客们,基于此協(xié)議的客戶端與消息中間件可以無視消息來源傳遞消息,不受客戶端弟劲、消息中間件祷安、不同的開發(fā)語言環(huán)境等條件的限制;
  • 支持主流操作系統(tǒng):Linux兔乞、Windows,MacOX等凉唐;
  • 支持多種客戶端開發(fā)語言:Java庸追、Python、Ruby台囱、.NET淡溯,PHP、C/C++簿训、Node.js等

術(shù)語說明

  • Server(Broker):接收客戶端連接咱娶,實(shí)現(xiàn)AMQP協(xié)議的消息隊(duì)列和路由功能的進(jìn)程;
  • Virtual Host:虛擬主機(jī)的概念强品,類似權(quán)限控制組膘侮,一個(gè)Virtual Host里可以有多個(gè)Exchange和Queue,權(quán)限控制的最小麗都是Virtual Host;
  • Exchange:交換機(jī)的榛,接收生產(chǎn)者發(fā)送的消息琼了,并根據(jù)Routing Key將消息路由到服務(wù)器中的隊(duì)列Queue。
  • ExchangeType:交換機(jī)類型決定了路由消息行為夫晌,RabbitMQ中有三種類型Exchange雕薪,分別是fanout、direct晓淀、topic所袁;
  • Message Queue:消息隊(duì)列,用于存儲(chǔ)還未被消費(fèi)者消費(fèi)的消息凶掰;
  • Message:由Header和body組成燥爷,Header是由生產(chǎn)者添加的各種屬性的集合,包括Message是否被持久化锄俄、優(yōu)先級(jí)是多少局劲、由哪個(gè)Message Queue接收等;body是真正需要發(fā)送的數(shù)據(jù)內(nèi)容奶赠;
    BindingKey:綁定關(guān)鍵字鱼填,將一個(gè)特定的Exchange和一個(gè)特定的Queue綁定起來。

2.RabbitMQ安裝啟動(dòng)與管理

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

到RabbitMQ官網(wǎng)下載win64位最新版erlang和rabbitmq-server的安裝包毅戈,分別是 erlang otp_win64_19.3和rabbitmq-server-3.6.9苹丸。注意安裝時(shí)計(jì)算機(jī)全名最好是英文愤惰,先安裝erlang,再安裝rabbitmq-server赘理,根據(jù)安裝向?qū)Щ卵裕捎媚J(rèn)安裝配置即可。安裝完成后商模,可以從開始-所有程序中找到RabbitMQ Server如下圖所示:



點(diǎn)RabbitMQ Command Prompt啟動(dòng)命令行奠旺,輸入rabbitmq-plugins enable rabbitmq_management



啟動(dòng)管理工具,在瀏覽器中輸入http://127.0.0.1:15672/即可打開管理登錄界面施流,默認(rèn)超級(jí)管理員用戶名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
操作命令:
啟動(dòng) service rabbitmq-server start
停止 service rabbitmq-server stop
重啟 service rabbitmq-server restart
設(shè)置開機(jī)啟動(dòng) 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:用戶角色說明
** 超級(jí)管理員(administrator)**
可登陸管理控制臺(tái)响疚,可查看所有的信息,并且可以對(duì)用戶瞪醋,策略(policy)進(jìn)行操作忿晕。
監(jiān)控者(monitoring)
可登陸管理控制臺(tái),同時(shí)可以查看rabbitmq節(jié)點(diǎn)的相關(guān)信息(進(jìn)程數(shù)银受,內(nèi)存使用情況践盼,磁盤使用情況等)
策略制定者(policymaker)
可登陸管理控制臺(tái), 同時(shí)可以對(duì)policy進(jìn)行管理,但無法查看節(jié)點(diǎn)的相關(guān)信息。
普通管理者(management)
僅可登陸管理控制臺(tái)宾巍,無法看到節(jié)點(diǎn)信息咕幻,也無法對(duì)策略進(jìn)行管理。
其他none
無法登陸管理控制臺(tái)蜀漆,通常就是普通的生產(chǎn)者和消費(fèi)者谅河。
Admin-Virtual Host-Add virtual host
Admin-Virtual Host

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

3.RabbitMQ的五種隊(duì)列模式與實(shí)例

3.1 簡(jiǎn)單模式Hello World

簡(jiǎn)單模式Hello World

功能:一個(gè)生產(chǎn)者P發(fā)送消息到隊(duì)列Q,一個(gè)消費(fèi)者C接收
生產(chǎn)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory绷耍,設(shè)置服務(wù)地址127.0.0.1,端口號(hào)5672鲜侥,設(shè)置用戶名褂始、密碼、virtual host描函,從連接工廠中獲取連接connection崎苗,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊(duì)列queue舀寓,使用通道channel向隊(duì)列中發(fā)送消息胆数,關(guān)閉通道和連接。
生產(chǎn)者實(shí)現(xiàn)思路

消費(fèi)者實(shí)現(xiàn)思路
創(chuàng)建連接工廠ConnectionFactory互墓,設(shè)置服務(wù)地址127.0.0.1必尼,端口號(hào)5672,設(shè)置用戶名、密碼判莉、virtual host豆挽,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel券盅,使用通道channel創(chuàng)建隊(duì)列queue, 創(chuàng)建消費(fèi)者并監(jiān)聽隊(duì)列帮哈,從隊(duì)列中讀取消息。
消費(fèi)者實(shí)現(xiàn)思路


3.2 工作隊(duì)列模式Work Queue

工作隊(duì)列模式Work Queue

功能:一個(gè)生產(chǎn)者锰镀,多個(gè)消費(fèi)者娘侍,每個(gè)消費(fèi)者獲取到的消息唯一,多個(gè)消費(fèi)者只有一個(gè)隊(duì)列
任務(wù)隊(duì)列:避免立即做一個(gè)資源密集型任務(wù)泳炉,必須等待它完成私蕾,而是把這個(gè)任務(wù)安排到稍后再做。我們將任務(wù)封裝為消息并將其發(fā)送給隊(duì)列胡桃。后臺(tái)運(yùn)行的工作進(jìn)程將彈出任務(wù)并最終執(zhí)行作業(yè)。當(dāng)有多個(gè)worker同時(shí)運(yùn)行時(shí)磕潮,任務(wù)將在它們之間共享翠胰。
生產(chǎn)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設(shè)置服務(wù)地址127.0.0.1自脯,端口號(hào)5672之景,設(shè)置用戶名、密碼膏潮、virtual host锻狗,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel焕参,使用通道channel創(chuàng)建隊(duì)列queue轻纪,使用通道channel向隊(duì)列中發(fā)送消息,2條消息之間間隔一定時(shí)間叠纷,關(guān)閉通道和連接刻帚。
生產(chǎn)者實(shí)現(xiàn)思路

消費(fèi)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設(shè)置服務(wù)地址127.0.0.1涩嚣,端口號(hào)5672崇众,設(shè)置用戶名、密碼航厚、virtual host顷歌,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel幔睬,使用通道channel創(chuàng)建隊(duì)列queue眯漩,創(chuàng)建消費(fèi)者C1并監(jiān)聽隊(duì)列,獲取消息并暫停10ms溪窒,另外一個(gè)消費(fèi)者C2暫停1000ms坤塞,由于消費(fèi)者C1消費(fèi)速度快冯勉,所以C1可以執(zhí)行更多的任務(wù)。
消費(fèi)者實(shí)現(xiàn)思路


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

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

功能:一個(gè)生產(chǎn)者發(fā)送的消息會(huì)被多個(gè)消費(fèi)者獲取摹芙。一個(gè)生產(chǎn)者灼狰、一個(gè)交換機(jī)、多個(gè)隊(duì)列浮禾、多個(gè)消費(fèi)者
生產(chǎn)者:可以將消息發(fā)送到隊(duì)列或者是交換機(jī)交胚。
消費(fèi)者:只能從隊(duì)列中獲取消息。
如果消息發(fā)送到?jīng)]有隊(duì)列綁定的交換機(jī)上盈电,那么消息將丟失蝴簇。
交換機(jī)不能存儲(chǔ)消息,消息存儲(chǔ)在隊(duì)列中
生產(chǎn)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory匆帚,設(shè)置服務(wù)地址127.0.0.1熬词,端口號(hào)5672,設(shè)置用戶名吸重、密碼互拾、virtual host,從連接工廠中獲取連接connection嚎幸,使用連接創(chuàng)建通道channel颜矿,使用通道channel創(chuàng)建隊(duì)列queue,使用通道channel創(chuàng)建交換機(jī)并指定交換機(jī)類型為fanout嫉晶,使用通道向交換機(jī)發(fā)送消息骑疆,關(guān)閉通道和連接。
生產(chǎn)者實(shí)現(xiàn)思路

消費(fèi)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory替废,設(shè)置服務(wù)地址127.0.0.1箍铭,端口號(hào)5672,設(shè)置用戶名舶担、密碼坡疼、virtual host,從連接工廠中獲取連接connection衣陶,使用連接創(chuàng)建通道channel柄瑰,使用通道channel創(chuàng)建隊(duì)列queue,綁定隊(duì)列到交換機(jī)剪况,設(shè)置Qos=1教沾,創(chuàng)建消費(fèi)者并監(jiān)聽隊(duì)列,使用手動(dòng)方式返回完成译断∈诜可以有多個(gè)隊(duì)列綁定到交換機(jī),多個(gè)消費(fèi)者進(jìn)行監(jiān)聽。
消費(fèi)者實(shí)現(xiàn)思路


3.4路由模式Routing

路由模式Routing

說明:生產(chǎn)者發(fā)送消息到交換機(jī)并且要指定路由key堪唐,消費(fèi)者將隊(duì)列綁定到交換機(jī)時(shí)需要指定路由key
生產(chǎn)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory巡语,設(shè)置服務(wù)地址127.0.0.1,端口號(hào)5672淮菠,設(shè)置用戶名男公、密碼、virtual host合陵,從連接工廠中獲取連接connection枢赔,使用連接創(chuàng)建通道channel,使用通道channel創(chuàng)建隊(duì)列queue拥知,使用通道channel創(chuàng)建交換機(jī)并指定交換機(jī)類型為direct踏拜,使用通道向交換機(jī)發(fā)送消息并指定key=b,關(guān)閉通道和連接低剔。
生產(chǎn)者實(shí)現(xiàn)思路

消費(fèi)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory速梗,設(shè)置服務(wù)地址127.0.0.1,端口號(hào)5672襟齿,設(shè)置用戶名镀琉、密碼、virtual host蕊唐,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel烁设,使用通道channel創(chuàng)建隊(duì)列queue替梨,綁定隊(duì)列到交換機(jī),設(shè)置Qos=1装黑,創(chuàng)建消費(fèi)者并監(jiān)聽隊(duì)列副瀑,使用手動(dòng)方式返回完成×堤罚可以有多個(gè)隊(duì)列綁定到交換機(jī),但只要綁定key=b的隊(duì)列key接收到消息糠睡,多個(gè)消費(fèi)者進(jìn)行監(jiān)聽。
消費(fèi)者實(shí)現(xiàn)思路


3.5通配符模式Topic

通配符模式Topic

說明:生產(chǎn)者P發(fā)送消息到交換機(jī)X疚颊,type=topic狈孔,交換機(jī)根據(jù)綁定隊(duì)列的routing key的值進(jìn)行通配符匹配;
符號(hào)#:匹配一個(gè)或者多個(gè)詞 lazy.# 可以匹配 lazy.irs或者lazy.irs.cor
符號(hào)*:只能匹配一個(gè)詞 lazy.* 可以匹配 lazy.irs或者lazy.cor
生產(chǎn)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory材义,設(shè)置服務(wù)地址127.0.0.1均抽,端口號(hào)5672,設(shè)置用戶名其掂、密碼油挥、virtual host,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel深寥,使用通道channel創(chuàng)建隊(duì)列queue攘乒,使用通道channel創(chuàng)建交換機(jī)并指定交換機(jī)類型為topic,使用通道向交換機(jī)發(fā)送消息并指定key=key.1惋鹅,關(guān)閉通道和連接则酝。
生產(chǎn)者實(shí)現(xiàn)思路

消費(fèi)者實(shí)現(xiàn)思路:
創(chuàng)建連接工廠ConnectionFactory,設(shè)置服務(wù)地址127.0.0.1负饲,端口號(hào)5672堤魁,設(shè)置用戶名、密碼返十、virtual host妥泉,從連接工廠中獲取連接connection,使用連接創(chuàng)建通道channel洞坑,使用通道channel創(chuàng)建隊(duì)列queue盲链,綁定隊(duì)列到交換機(jī),設(shè)置Qos=1迟杂,創(chuàng)建消費(fèi)者并監(jiān)聽隊(duì)列刽沾,使用手動(dòng)方式返回完成∨趴剑可以有多個(gè)隊(duì)列綁定到交換機(jī),凡是綁定規(guī)則符合通配符規(guī)則的隊(duì)列均可以接收到消息侧漓,比如key.*,key.#,多個(gè)消費(fèi)者進(jìn)行監(jiān)聽监氢。
消費(fèi)者實(shí)現(xiàn)思路

4.Spring集成RabbitMQ配置

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


Spring集成RabbitMQ配置

5.總結(jié)

RabbitMQ提供6種模式浪腐,分別是Hello纵揍,Work Queue,Publish/Subscribe议街,Routing泽谨,Topics,RPC Request/reply特漩,本文詳細(xì)講述了前5種吧雹,并給出代碼實(shí)現(xiàn)和思路。其中Publish/Subscribe涂身,Routing吮炕,Topics三種模式可以統(tǒng)一歸為Exchange模式,只是創(chuàng)建時(shí)交換機(jī)的類型不一樣访得,分別是fanout龙亲、direct陕凹、topic。Spring提供了rabbitmq的一個(gè)實(shí)現(xiàn)鳄炉,所以集成起來很方便杜耙,本文第4章給出了訂閱者模式的一種spring配置。

本訂閱號(hào)提供Java相關(guān)技術(shù)分享拂盯,從Java編程基礎(chǔ)到Java高級(jí)技術(shù)佑女,從JavaWeb技術(shù)基礎(chǔ)Jsp、Servlet谈竿、>JDBC到SSH团驱、SSM開發(fā)框架,從REST風(fēng)格接口設(shè)計(jì)到分布式項(xiàng)目實(shí)戰(zhàn)空凸。剖析主流開源技術(shù)框架嚎花,用親身
實(shí)踐來譜寫深度Java技術(shù)日志。

Java技術(shù)日志

歡迎關(guān)注 Java技術(shù)日志 微信訂閱號(hào)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呀洲,一起剝皮案震驚了整個(gè)濱河市紊选,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌道逗,老刑警劉巖兵罢,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滓窍,居然都是意外死亡卖词,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門吏夯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坏平,“玉大人,你說我怎么就攤上這事锦亦。” “怎么了令境?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵杠园,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我舔庶,道長(zhǎng)抛蚁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任惕橙,我火速辦了婚禮瞧甩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弥鹦。我一直安慰自己肚逸,他們只是感情好爷辙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朦促,像睡著了一般膝晾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上务冕,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天血当,我揣著相機(jī)與錄音,去河邊找鬼禀忆。 笑死臊旭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的箩退。 我是一名探鬼主播离熏,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乏德!你這毒婦竟也來了撤奸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤喊括,失蹤者是張志新(化名)和其女友劉穎胧瓜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郑什,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡府喳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蘑拯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钝满。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖申窘,靈堂內(nèi)的尸體忽然破棺而出弯蚜,到底是詐尸還是另有隱情,我是刑警寧澤剃法,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布碎捺,位于F島的核電站,受9級(jí)特大地震影響贷洲,放射性物質(zhì)發(fā)生泄漏收厨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一优构、第九天 我趴在偏房一處隱蔽的房頂上張望诵叁。 院中可真熱鬧,春花似錦钦椭、人聲如沸拧额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽势腮。三九已至联贩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捎拯,已是汗流浹背泪幌。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留署照,地道東北人祸泪。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像建芙,于是被迫代替她去往敵國(guó)和親没隘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

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