詳解rabbitmq

1 概述

1.1 認(rèn)識(shí)消息隊(duì)列

message queue 簡(jiǎn)稱MQ,是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞信息

MQ作為消息的中間件,最主要的作用是各個(gè)系統(tǒng)之間的消息傳遞進(jìn)行"解耦",mq是數(shù)據(jù)可靠性的重要保證

1.2 什么是rabbitMq

rabbitmq是全世界最火的開(kāi)源代理服務(wù)器,再全世界有35000個(gè)項(xiàng)目部署再rabbitMq

rabbitmq 幾乎支持所有的操作系統(tǒng)與編程語(yǔ)言

rabbitmq提供了高并發(fā),高可用的部署方案,支持多種消息協(xié)議,容易部署和維護(hù)

1.3 rabbitmq 和其他mq比較

rabbitmqactivemqkafkarocketmq

社區(qū)活躍度非常活躍非常活躍活躍不活躍

持久化支持支持支持支持

并發(fā)吞吐量高一般極高極高

數(shù)據(jù)可靠性極高一般高高

生態(tài)完整性很好很好很好一般

用戶總量多多==>一般較多少

應(yīng)用場(chǎng)景分布式 高可靠的交易系統(tǒng)傳統(tǒng)業(yè)務(wù)系統(tǒng)日志處理和大數(shù)據(jù)應(yīng)用互聯(lián)網(wǎng)高并發(fā),高可用

2 安裝

基于docker 安裝rabbitmq#指定版本溶弟,該版本包含了web控制頁(yè)面

docker pull rabbitmq:management

#方式一:默認(rèn)guest 用戶绽榛,密碼也是 guest

docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management

#方式二:設(shè)置用戶名和密碼

docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management

方式三:jar包安裝

1 下載esl-erlang_21.0-1~centos~7_amd64.rpm**

Erlang運(yùn)行環(huán)境RPM包

2. 下載rabbitmq-server-3.7.7-1.el7.noarch.rpm**

rabbitmq服務(wù)器程序

3. mkdir /usr/local/temp*

4. cd /usr/local/temp**

5. 通過(guò)XFTP將文件上傳至temp目錄**

6. rpm -ivh --nodeps esl-erlang_21.0-1~centos~7_amd64.rpm**

安裝RPM包

7.rpm -ivh --nodeps rabbitmq-server-3.7.7-1.el7.noarch.rpm**

8. rabbitmq-plugins enable rabbitmq_management**

啟用控制臺(tái)

9. rabbitmq-server

10. chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie**

啟用服務(wù)

11. 防火墻放行5672/15672端口

訪問(wèn)

http://localhost:15672/

3 常用命令

3.1啟動(dòng)和關(guān)閉

rabbitmq-server 前臺(tái)啟動(dòng)服務(wù)

rabbitmq-server -detached 后臺(tái)啟動(dòng)服務(wù)

rabbitmqctl stop 停止服務(wù)

3.2 終止和啟動(dòng)應(yīng)用

rabbitmqctl start_app 啟動(dòng)應(yīng)用

rabbitmqctl stop_app 終止應(yīng)用

3.3 用戶管理

rabbitmqctl add_user {username} {password}

– 創(chuàng)建新用戶

rabbitmqctl delete_user {username}

– 刪除用戶

rabbitmqctl change_password {username} {newpassword}

– 重置密碼

rabbitmqctl set_user_tags {username} {tag}

– 授予用戶角色(Tag)

rabbitmqctl set_permissions -p / user_admin '.' '.' '.*'

設(shè)置用戶允許訪問(wèn)的vhost

3.4 rabbitmq 四種tag

超級(jí)管理員(administrator)

– 可登陸管理控制臺(tái)(啟用management plugin的情況下),可查看所有 的信息胳徽,并且可以對(duì)用戶积锅,策略(policy)進(jìn)行操作爽彤。

監(jiān)控者(monitoring)

– 登陸管理控制臺(tái)(啟用management plugin的情況下),同時(shí)可以查看 rabbitmq節(jié)點(diǎn)的相關(guān)信息(進(jìn)程數(shù)缚陷,內(nèi)存使用情況适篙,磁盤使用情況等)

策略制定者(policymaker)

– 可登陸管理控制臺(tái)(啟用management plugin的情況下), 同時(shí)可以對(duì) policy進(jìn)行管理。但無(wú)法查看節(jié)點(diǎn)的相關(guān)信息(上圖紅框標(biāo)識(shí)的部分)

普通管理者(management)

僅可登陸管理控制臺(tái)(啟用management plugin的情況下)箫爷,無(wú)法看到 節(jié)點(diǎn)信息嚷节,也無(wú)法對(duì)策略進(jìn)行管理。

4 第一次MQ通信

4.1 AMQP

AMQP虎锚,即Advanced Message Queuing Protocol,一個(gè)提供統(tǒng) 一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開(kāi) 放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)硫痰。基于此協(xié)議的客戶端與消息中間 件可傳遞消息窜护,并不受客戶端/中間件不同產(chǎn)品效斑,不同的開(kāi)發(fā)語(yǔ)言等 條件的限制。Erlang中的實(shí)現(xiàn)有 RabbitMQ等

4.2 基本概念

Producer:生產(chǎn)者,消息的提供者

Consumer:消費(fèi)者,消息的使用者

Message:消息柱徙,程序間的通信的數(shù)據(jù)

Queue:隊(duì)列缓屠,消息存放的容器,消息先進(jìn)先出

Vhost:虛擬主機(jī),相當(dāng)于MQ的“數(shù)據(jù)庫(kù)” 坐搔,用于存儲(chǔ)隊(duì)列

5 rabbitmq的工作模式

1? 一個(gè)生產(chǎn)這? 多個(gè)消費(fèi)者? 一個(gè)消息 只適用于一個(gè)消費(fèi)者

2發(fā)布訂閱? 交換機(jī)? (把消息生成副本) 多個(gè)消費(fèi)者都可以看一個(gè)消息,消息會(huì)重復(fù)發(fā)給一個(gè)消費(fèi)者

3 路由器? 根據(jù)一定條件把消息 送給消費(fèi)者,再3的基礎(chǔ)上強(qiáng)調(diào)了根據(jù)規(guī)則

4? 主題模式? 定義一個(gè)表達(dá)式規(guī)程? 按照規(guī)則把消息送給指定的人(再4 的基礎(chǔ)上根據(jù)模糊匹配實(shí)現(xiàn))

5 Rpc 遠(yuǎn)程調(diào)用? 不同語(yǔ)言(dubbo? springcloud? webservice都可以實(shí)現(xiàn),rpc不是mq的強(qiáng)項(xiàng))

6 Work Queue工作隊(duì)列


本講將創(chuàng)建一個(gè)工作隊(duì)列(Work Queue)藏研,它會(huì)發(fā) 送一些耗時(shí)的任務(wù)給多個(gè)工作者(Worker)。

在多個(gè)消息的情況下概行,Work Queue會(huì)將消息分派給 不同的消費(fèi)者蠢挡,每個(gè)消費(fèi)者都會(huì)接收到不同的消息,并且可以根據(jù)處理消息的速度來(lái)接收消息的數(shù)量凳忙,進(jìn)

而讓消費(fèi)者程序發(fā)揮最大性能业踏。

Work Queue特別適合在集群環(huán)境中做異步處理,能最大程序發(fā)揮每一臺(tái)服務(wù)器的性能涧卵。

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


發(fā)布/訂閱模式中勤家,生產(chǎn)者不再直接與隊(duì)列綁定, 而是將數(shù)據(jù)發(fā)送至“交換機(jī)Exchange

交換機(jī)Exchange用于將數(shù)據(jù)按某種規(guī)則送入與之綁定的隊(duì)列柳恐,進(jìn)而供消費(fèi)者使用伐脖。 發(fā)布/訂閱模式中,交換機(jī)將無(wú)差別的將所有消 息送入與之綁定的隊(duì)列乐设,所有消費(fèi)者拿到的消息完全相同讼庇,交換機(jī)的類型被稱為fanout

7.1 發(fā)布/訂閱模式使用場(chǎng)景

發(fā)布訂閱模式因?yàn)樗邢M(fèi)者獲得相同的消息,所以 特別適合“數(shù)據(jù)提供商與應(yīng)用商

例如:中國(guó)氣象局提供“天氣預(yù)報(bào)”送入交換機(jī)近尚,網(wǎng)易市咆、新浪蕴纳、百度巡球、搜狐等門戶接入通過(guò)隊(duì)列綁定到該

交換機(jī)睁搭,自動(dòng)獲取氣象局推送的氣象數(shù)據(jù)。

8 路由Routing模式

路由(Routing)模式是在發(fā)布訂閱模式 基礎(chǔ)上的變種。 發(fā)布訂閱模式是無(wú)條件將所有消息分發(fā)給 所有消費(fèi)者隊(duì)列。

路由模式則是交換機(jī)根據(jù)Routing Key有條件的將數(shù)據(jù)篩選后發(fā)給消費(fèi)者隊(duì)列。

路由模式下交換機(jī)的類型被稱為direct留瞳,隊(duì)列和交換機(jī)可以自己綁定

9 主題Topic模式

主題Topic模式是在Routing模式基礎(chǔ)上, 提供了對(duì)RouteKey模糊匹配的功能叹卷,可以

簡(jiǎn)化程序的編寫(xiě)撼港。

主題模式下,模糊匹配表達(dá)式規(guī)則為

* 匹配單個(gè)關(guān)鍵字

# 匹配所有關(guān)鍵字

主題模式下交換機(jī)的類型被稱為topic骤竹。隊(duì)列和交換機(jī)可以自己綁定

10? Confirm & Return

Confirm代表生產(chǎn)者將消息送到Broker時(shí)產(chǎn)生的狀態(tài)帝牡,后續(xù)

會(huì)出現(xiàn)兩種情況:

ack 代表Broker已經(jīng)將數(shù)據(jù)接收。

nack 代表Broker拒收消息蒙揣。原因有多種靶溜,隊(duì)列已滿,限流懒震,IO異常...

Return代表消息被Broker正常接收(ack)后罩息,但Broker沒(méi)

有對(duì)應(yīng)的隊(duì)列進(jìn)行投遞時(shí)產(chǎn)生的狀態(tài),消息被退回給生產(chǎn)者个扰。

注意:上面兩種狀態(tài)只代表生產(chǎn)者與Broker之間消息投遞的

情況瓷炮。與消費(fèi)者是否接收/確認(rèn)消息無(wú)關(guān)。

11 RabbitMQ集群架構(gòu)模式


RabbitMQ集群包含四種架構(gòu)模式:

主備模式 (Warren)

鏡像模式 (Mirror)

遠(yuǎn)程模式 (Shovel)

多活模式 (Federation)

11.1 主備模式 (Warren)

主備模式; 實(shí)現(xiàn)rabbitmq的高可用集群递宅,一般在并發(fā)數(shù)量不高的情況下使用娘香。這種模型非常好用并且簡(jiǎn)單,主備模式也稱為 warren模式

11.2? 鏡像模式 (Mirror)

集群模式非常經(jīng)典的就是mirror 鏡像模式 办龄,保證數(shù)據(jù)100% 不丟失烘绽,實(shí)際工作中也是使用最多的。并且實(shí)現(xiàn)集群非常簡(jiǎn)單俐填,互聯(lián)網(wǎng)大廠通常會(huì)構(gòu)建這種集群模式

11.3 遠(yuǎn)程模式 (Shovel)

遠(yuǎn)程模式可以實(shí)現(xiàn)雙活的一種模式安接,簡(jiǎn)稱shovel,所謂shovel就是我們可以把消息進(jìn)行不同的數(shù)據(jù)中心復(fù)制的工作英融,我們可以地域讓兩個(gè)mq集群互聯(lián)

11.4 多活模式 (Federation)

多活模式是實(shí)現(xiàn)異地?cái)?shù)據(jù)復(fù)制的主流模式盏檐,因?yàn)閟hovel 模式配置比較復(fù)雜,所以一般來(lái)說(shuō)實(shí)現(xiàn)異地集群都是用這種雙活或者多活模式驶悟,這種模型需要依賴rabbitmq 的federation插件胡野,可以實(shí)現(xiàn)持續(xù)的amqp數(shù)據(jù)通信。

12 搭建mirror集群

12.1 準(zhǔn)備兩個(gè)已安裝好RabbitMQ的Centos環(huán)境

修改hostname

vim /etc/hostname

m1

m2

加入主機(jī)列表 vim /etc/hosts

vim /etc/hosts

192.168.132.137 m1

192.168.132.139 m2

12.2 準(zhǔn)備工作-開(kāi)放防火墻端口

開(kāi)放防火墻 4369/5672/15672/25672端口

firewall-cmd --zone=public --add-port=4369/tcp --permanent

firewall-cmd --zone=public --add-port=5672/tcp --permanent

firewall-cmd --zone=public --add-port=15672/tcp --permanent

firewall-cmd --zone=public --add-port=25672/tcp --permanent

firewall-cmd --reload

重啟兩臺(tái)主機(jī)

– reboot

12.3 復(fù)制.erlang.cookie

.erlang.cookie是erlang分布式的token文件撩银,集群內(nèi)所有設(shè)備要

持有相同的.erlang.cookie文件才允許彼此通信给涕。

find / -name *.cookie

scp /var/lib/rabbitmq/.erlang.cookie 192.168.132.134:/var/lib/rabbitmq/

在兩臺(tái)電腦上執(zhí)行chmod進(jìn)行授權(quán)

chmod 400 /var/lib/rabbitmq/.erlang.cookie

12.4 配置鏡像集群

在m2服務(wù)器上執(zhí)行下面的命令將與m1服務(wù)器進(jìn)行復(fù)制

rabbitmqctl stop_app 暫停服務(wù)

rabbitmqctl join_cluster rabbit@m1 加入到m1的集群

rabbitmqctl start_app 啟動(dòng)服務(wù)

rabbitmqctl cluster_status 驗(yàn)證集群結(jié)果

13 利用haproxy負(fù)載均衡

13.1鏡像模式遇到的問(wèn)題

13.2 HAProxy 代理服務(wù)器

HAProxy 是一款提供高可用性豺憔、負(fù)載均衡以及基于TCP(第四層)

和HTTP(第七層)應(yīng)用的代理軟件额获,支持虛擬主機(jī)够庙,它是免費(fèi)、

快速并且可靠的一種解決方案抄邀。

RabbitMQ集群鏡像模式中耘眨,HAProxy用于做Tcp,提供節(jié)點(diǎn)負(fù)載

均衡(LB-LoadBalance)與故障發(fā)現(xiàn)境肾。

13.3 haproxy安裝

yum install haproxy? //安裝

rpm -ql haproxy? //查看安裝是不是成功

find / -name haproxy.cfg? //找到核心配置文件

haproxy -f /etc/haproxy/haproxy.cfg? ? //啟動(dòng)命令

13.4 haproxy.cfg配置詳解

listen rabbitmq_cluster

bind 0.0.0.0:5672 #通過(guò)5672對(duì)M1剔难、M2進(jìn)行映射

option tcplog #記錄tcp 連接的狀態(tài)和時(shí)間

mode tcp #四層協(xié)議代理,即對(duì)TCP協(xié)議轉(zhuǎn)發(fā)

option clitcpka #開(kāi)啟TCP的Keep Alive(長(zhǎng)連接模式)

timeout connect 1s #haproxy與mq建立連接的超時(shí)時(shí)間

timeout client 10s #客戶端與haproxy最大空閑時(shí)間奥喻。

timeout server 10s #服務(wù)器與haproxy最大空閑時(shí)間偶宫。

balance roundrobin #采用輪詢轉(zhuǎn)發(fā)消息

#每5秒發(fā)送一次心跳包,如連續(xù)兩次有響應(yīng)則代表狀態(tài)良好环鲤,

#如連續(xù)三次沒(méi)有響應(yīng)纯趋,則視為服務(wù)故障,該節(jié)點(diǎn)將被剔除冷离。

server node1 192.168.132.137:5672 check inter 5s rise 2 fall 3

server node2 192.168.132.139:5672 check inter 5s rise 2? 2 fall 3

listen http_front

#監(jiān)聽(tīng)端口

bind 0.0.0.0:1080

#統(tǒng)計(jì)頁(yè)面自動(dòng)刷新時(shí)間

stats refresh 30s

#統(tǒng)計(jì)頁(yè)面url

stats uri /haproxy?stats

#統(tǒng)計(jì)頁(yè)面用戶名和密碼設(shè)置

stats auth admin:admin

訪問(wèn) :http://am3:1080/ha

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吵冒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子西剥,更是在濱河造成了極大的恐慌痹栖,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞭空,死亡現(xiàn)場(chǎng)離奇詭異揪阿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)匙铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門图甜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鳖眼,你說(shuō)我怎么就攤上這事黑毅。” “怎么了钦讳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵矿瘦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我愿卒,道長(zhǎng)缚去,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任琼开,我火速辦了婚禮易结,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己搞动,他們只是感情好躏精,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鹦肿,像睡著了一般矗烛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箩溃,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天瞭吃,我揣著相機(jī)與錄音,去河邊找鬼涣旨。 笑死歪架,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霹陡。 我是一名探鬼主播牡拇,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼穆律!你這毒婦竟也來(lái)了惠呼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤峦耘,失蹤者是張志新(化名)和其女友劉穎剔蹋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辅髓,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泣崩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洛口。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫付。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖第焰,靈堂內(nèi)的尸體忽然破棺而出买优,到底是詐尸還是另有隱情,我是刑警寧澤挺举,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布杀赢,位于F島的核電站,受9級(jí)特大地震影響湘纵,放射性物質(zhì)發(fā)生泄漏脂崔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一梧喷、第九天 我趴在偏房一處隱蔽的房頂上張望砌左。 院中可真熱鬧脖咐,春花似錦、人聲如沸汇歹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秤朗。三九已至,卻和暖如春笔喉,著一層夾襖步出監(jiān)牢的瞬間取视,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工常挚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留作谭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓奄毡,卻偏偏與公主長(zhǎng)得像折欠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吼过,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350