RabbitMQ高階特性都不會,憑什麼要漲薪?

2022-08-23 10:42:12 字數 4084 閱讀 4443

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的費用,都是買號一次付清,永久使用,但是 昂貴,對小公司或者不...