RabbitMq
image.png
1. 背景
a. AMQP-高級(jí)消息隊(duì)列協(xié)議
b. 解耦
c. 方便拓展
2. 概念
A. 消費(fèi)者和生產(chǎn)者
(1). 生產(chǎn)者-producer創(chuàng)建消息,然后發(fā)布(發(fā)送到)代理服務(wù)器(RabbitMQ)
$1. 什么是消息
a. 有效載荷(payload)
任意數(shù)據(jù)煤惩,任意格式
b. 標(biāo)簽(label)
描述了有效載荷,RabbitMQ通過(guò)它能決定誰(shuí)能獲得消息的拷貝
c. 發(fā)后即忘(fire-and-forget)的通信方式
(2). 消費(fèi)者連接到代理服務(wù)器,訂閱到隊(duì)列上
a. 隊(duì)列類(lèi)似一個(gè)具名郵箱
b. 消息在到達(dá)隊(duì)列后,RabbitMQ會(huì)把消息傳遞給其中的一個(gè)訂閱/監(jiān)聽(tīng)的消費(fèi)者
c. 消息標(biāo)簽不會(huì)隨著有效載荷一同傳遞
d. 如果需要得知發(fā)送方信息,只有把發(fā)送方信息放入有效載荷中
(3). 信道(生產(chǎn)者或消費(fèi)者向服務(wù)器建立連接)
a. 建立在tcp連接內(nèi)的虛擬連接
b. 每條信道都會(huì)有一個(gè)唯一的ID(AMQP庫(kù)存儲(chǔ))
c. 避免了每次建立和銷(xiāo)毀TCP連接會(huì)話(huà)帶來(lái)的開(kāi)銷(xiāo)
d. 避免了遭遇高峰期操作系統(tǒng)TCP的瓶頸
e. 一次tcp連接里可以創(chuàng)建多條信道,既保證了線(xiàn)程的私密性,同時(shí)也避免了給操作系統(tǒng)的tcp棧帶來(lái)額外負(fù)擔(dān)
B. AMQP消息路由
(1). 隊(duì)列
$1. AMQP消息通信的基礎(chǔ)模塊
a. 為消息提供了住所,消息在此等待消費(fèi)
b .對(duì)負(fù)載均衡來(lái)說(shuō),隊(duì)列是絕佳方案,只需附加一堆消費(fèi)者,并讓RabbitMQ以循環(huán)的方式均勻的分配發(fā)來(lái)的消息
c. 隊(duì)列是RabbitMQ中消息最后的終點(diǎn)(除非消息進(jìn)入了黑洞)
$2. 消費(fèi)者通過(guò)兩種方式接受特定隊(duì)列里的消息
a. basic.consume 訂閱
將信道設(shè)置為訂閱模式,消息到達(dá)隊(duì)列時(shí)自動(dòng)接受
b. basic.get 單條消息
不建議放在循環(huán)里使用,影響性能
消費(fèi)者應(yīng)通過(guò)consume來(lái)實(shí)現(xiàn)高吞吐量
$3. 隊(duì)列沒(méi)有消費(fèi)者訂閱
消息在隊(duì)列中等待,直到有消費(fèi)者訂閱,才把消息發(fā)給消費(fèi)者
$4. 多消費(fèi)者訂閱隊(duì)列
a. 機(jī)制
(1). 循環(huán)發(fā)送給消費(fèi)者
(2). 每條消息只會(huì)發(fā)送給一個(gè)消費(fèi)者
$5. 消費(fèi)者消息確認(rèn)機(jī)制
a. 命令
(1). basic.ack 顯示向Rabbit發(fā)送確認(rèn)
(2). auto_ack參數(shù)設(shè)置為true
b. 機(jī)制
(1). 消費(fèi)者收到消息沒(méi)有確認(rèn)就從服務(wù)器斷開(kāi)連接
Rabbit會(huì)把消息傳遞給下一位消費(fèi)者
(2). 消費(fèi)者收到消息沒(méi)有確認(rèn)并且仍在線(xiàn)
不會(huì)再往該消費(fèi)者發(fā)送消息了
c. 拒絕消息
(1). 從服務(wù)器斷開(kāi)連接
(2). RabbitMQ2.0以上版本,basic.reject
reject命令中的requeue的參數(shù)設(shè)置
為true 時(shí) ,RabbitMQ會(huì)自動(dòng)把消息傳送給下一個(gè)消費(fèi)者
為false時(shí),Rabbit會(huì)從隊(duì)列移除該消息,不會(huì)發(fā)送給其他消費(fèi)者
$6. 隊(duì)列創(chuàng)建
a. 須知
消費(fèi)者在同一條信道上訂閱另一條隊(duì)列時(shí),無(wú)法再聲明隊(duì)列,必須取消訂閱,設(shè)置信道為傳輸模式
b. 隊(duì)列名稱(chēng)
(1). 指定隊(duì)列名稱(chēng)
(2). 不指定名稱(chēng)
Rabbit隨機(jī)分配名稱(chēng)并在queue.declare命令中返回
c. 重點(diǎn)參數(shù)
(1). exclusive
為true時(shí),隊(duì)列變成私有的, 只有當(dāng)前應(yīng)用程序才能消費(fèi)隊(duì)列炼邀,可以用來(lái)限制一個(gè)隊(duì)列只能有一個(gè)消費(fèi)者
(2). auto-delete
當(dāng)最后一個(gè)消費(fèi)者取消訂閱時(shí),隊(duì)列就會(huì)自動(dòng)移除
(2). 交換器
$1. 四種類(lèi)型的交換器
a. direct
如果路由建匹配,消息就被投遞到對(duì)應(yīng)的隊(duì)列
b. fanout
將收到的消息廣播到綁定的隊(duì)列上
c. topic
使來(lái)自不同源頭的消息到達(dá)相同的隊(duì)列上
(3). 多租戶(hù)于權(quán)限控制
$1. vhost 虛擬主機(jī)
a. 方便遷移
b. 數(shù)據(jù)隔離
$2. 權(quán)限控制可以在服務(wù)器上或vhost上
a.消息持久化與策略
* 必須點(diǎn)
(1). 消息的投遞模式設(shè)置成2
(2). 發(fā)送給持久化的交換器
(3). 到達(dá)持久化的隊(duì)列
b. AMQP事務(wù)
發(fā)送方確認(rèn)
3. 實(shí)踐
(1). 目的
$1. 解耦
$2. 提高請(qǐng)求處理速度
$3. 方便擴(kuò)展
(2). 發(fā)后即忘模式
$1. 概念
a. 創(chuàng)建任務(wù),放置到交換機(jī)上,無(wú)需知道結(jié)果
$2. 場(chǎng)景運(yùn)用
a. 日志告警框架
b. 并行處理
(1). 執(zhí)行主線(xiàn)任務(wù)
(2). 附帶任務(wù)分開(kāi)進(jìn)行
(3). 實(shí)現(xiàn)rpc
$1. 使用消息來(lái)發(fā)回應(yīng)答
a. AMQP消息頭字段 reply_to
b. 生產(chǎn)者以該字段創(chuàng)建隊(duì)列,并監(jiān)聽(tīng)隊(duì)列
c. 消費(fèi)者檢查該字段魄揉,并以該隊(duì)列名稱(chēng)作為路由鍵
$2. 匿名隊(duì)列