rabbitmq高階特性都不會,憑什麼要漲薪?
rabbitmq高階特性
(1)ack(
confirm
機制)(2)如何保證訊息百分百投遞成功
(3)冪等性
(4)return機制
(5)限流
(6)重回佇列
(7)ttl
(8)死信佇列
高階特性:
1. ack(
confirm
機制)1.1 什麼是
confirm
機制概念:pro傳送訊息到
broker,broker
接收到訊息後
,產生回送響應
pro中有乙個
confirm listener
非同步監聽響應應答
步驟:訊息的確認 pro投遞訊息後,如果
broker
收到訊息
,則會給
pro乙個應答
pro接收應答 用來確定這條訊息是否正常地傳送到
broker,
該法也是訊息可靠性投遞的核心保障
!1.2 confirm機制流程圖
1.3 實現
confirm
機制在channel上開啟確認模式:
$channel->confirm_select();
在channel上新增監聽:
$channel->wait_for_pending_acks();
監聽成功和失敗的返回結果,根據具體的結果對訊息進行重新傳送、或記錄日誌等後續處理。
2 保證訊息的百分百投遞成功
2.1 producer 的可靠性投遞
2.1.1 要求
保證訊息的成功發出
保證mq節點的成功接收
傳送端收到mq節點
(broker)
確認應答
完善的訊息補償機制
在實際生產中,很難保障前三點的完全可靠,比如在極端的環境中,生產者傳送訊息失敗了,傳送端在接受確認應答時突然發生網路閃斷等等情況,很難保障可靠性投遞,所以就需要有第四點完善的訊息補償機制。
2.1.2 解決方案
2.1.2.1 方案一
:訊息資訊落庫
,對訊息狀態進行打標
(常見方案
)將訊息持久化到db並設定狀態值,收到
consumer
的應答就改變當前記錄的狀態
.再輪詢重新傳送沒接收到應答的訊息,注意這裡要設定重試次數
.方案流程圖
缺點是:在第一步需要更新或者插入運算元據庫2次
優化:不需要訊息進行持久化
只需要業務持久化
3 冪等性
3.1 什麼是冪等性
使用者對於同一操作發起的一次請求或者多次請求的結果是一致的
比如資料庫的樂觀鎖,在執行更新操作前
,先去資料庫查詢
version,
然後執行更新語句,以
version
作為條件
,如果執行更新時有其他人先更新了這張表的資料
,那麼這個條件就不生效了
,也就不會執行操作了
,通過這種樂觀鎖的機制來保障冪等性
.3.2 con - 冪等性
3.2.1 什麼是
con -
冪等性在業務高峰期最容易產生訊息重複消費問題,當
con消費完訊息時,在給
pro返回
ack時由於網路中斷,導致
pro未收到確認資訊
,該條訊息就會重新傳送並被
con消費
,但實際上該消費者已成功消費了該條訊息
,這就造成了重複消費
.而con - 冪等性
,即訊息不會被多次消費
,即使我們收到了很多一樣的訊息
.3.2.2 主流冪等性實現方案
3.2.2.1 唯一
id+指紋碼
核心:利用資料庫主鍵去重
唯一id:業務表的主鍵
指紋碼:為了區別每次正常操作的碼,每次操作時生成指紋碼;可以用時間戳+業務編號或者標誌位(具體視業務場景而定)
優勢:實現簡單
弊端:高併發下有資料庫寫入的效能瓶頸
解決方案
根據id進行分庫分表演算法路由
4 return機制
4.1 什麼是
return
機制return listener用於處理一些不可路由的訊息。也是生產段新增的乙個監聽。
我們的訊息生產者,通過指定乙個exchange和
routingkey
,把訊息送達到某乙個佇列中去,然後我們的消費者監聽佇列,進行訊息處理操作。
4.2 **
return
機制5 限流機制
5.1 con - 限流機制
減壓限流設定api
$channel->basic_qos($prefetchsize, 20, $global);
prefetchsize: 單條訊息的大小限制,
con通常設定為
0,表示不做限制
prefetchcount: 一次最多能處理多少條訊息
global: 是否將上面設定
true
應用於channel
級別還是取
false
代表con
級別6 con - ack & 重回佇列機制
6.1 ack & nack
當我們設定autoack=false時
,就可以使用手工
ack方式了
,其實手工方式包括了手工
ack與
nack。
注意:如果由於伺服器宕機等嚴重問題,我們就需要手工
ack
保障con
消費成功
6.2 重回佇列
重回佇列是為了對沒有處理成功的訊息,將訊息重新投遞給
broker
重回佇列,會把消費失敗的訊息重新新增到佇列的尾端,供
con繼續消費
一般在實際應用中,都會關閉重回佇列
,即設定為
false
7.1 什麼是
ttlttl(time to live),即生存時間
rabbitmq支援訊息的過期時間,在訊息傳送時可以進行指定
rabbitmq支援為每個佇列設定訊息的超時時間,從訊息入佇列開始計算,只要超過了佇列的超時時間配置,那麼訊息會被自動清除。
8 死信佇列機制
8.1 什麼是死信佇列
dlx - 死信佇列
(dead-letter-exchange)
利用dlx,
當訊息在乙個佇列中變成死信
(dead message) 之後,
它能被重新
publish
到另乙個
exchange中,
這個exchange
就是dlx.
8.2 死信佇列的產生場景
訊息被拒絕(basic.reject / basic.nack),並且
requeue = false
訊息因ttl
過期 佇列達到最大長度
這些都不會丟人了
答案是1 空類被例項化,編譯器插進去的乙個char 使得這個class的不同實體 object 在記憶體中配置獨一無二的位址。也就是說這個char是用來標識類的不同物件的 解釋typedef void pfun void 概念理解 typedef是對已有的型別進行別名定義,不產生新的型別 defin...
生麼都不會寫什麼
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
以後都不會用altium designer!!!
前幾天聽乙個好朋友訴苦。他在公司上班時在論壇上下了ad的破解版,平時也沒怎麼用,就是開啟往來郵件。沒過2個月就被ad公司的法律顧問打 告知侵權並帶威脅性質的要求公司買號,不然就法院起訴。把我的朋友搞得心塞塞。了解這個情況後,我去詢問了ad的費用,都是買號一次付清,永久使用,但是 昂貴,對小公司或者不...