rabbitMQ系列2 rabbitMQ快速入門

2022-07-21 13:54:14 字數 2310 閱讀 7493

一、簡介:

以熟悉的電商場景為例,如果商品服務和訂單服務是兩個不同的微服務,在下單的過程中訂單服務需要呼叫商品服務進行扣庫存操作。按照傳統的方式,下單過程要等到呼叫完畢之後才能返回下單成功,如果網路產生波動等原因使得商品服務扣庫存延遲或者失敗,會帶來較差的使用者體驗,如果在高併發的場景下,這樣的處理顯然是不合適的,那怎麼進行優化呢?這就需要訊息佇列登場了。

訊息佇列提供乙個非同步通訊機制,訊息的傳送者不必一直等待到訊息被成功處理才返回,而是立即返回。訊息中介軟體負責處理網路通訊,如果網路連線不可用,訊息被暫存於佇列當中,當網路暢通的時候在將訊息**給相應的應用程式或者服務,當然前提是這些服務訂閱了該佇列。如果在商品服務和訂單服務之間使用訊息中介軟體,既可以提高併發量,又降低服務之間的耦合度。

rabbitmq就是這樣一款我們苦苦追尋的訊息佇列。rabbitmq是乙個開源的訊息**的佇列伺服器,用來通過普通協議在完全不同的應用之間共享資料。

rabbitmq是使用erlang語言來編寫的,並且rabbitmq是基於amqp協議的。erlang語言在資料互動方面效能優秀,有著和原生socket一樣的延遲,這也是rabbitmq高效能的原因所在。可謂「人如其名」,rabbitmq像兔子一樣迅速。

二、訊息佇列典型的應用場景:

三、rabbit mq的高階特性:

1、過期時間(毫秒):

rabbitmq可以對訊息和佇列設定過期時間。

rabbitmq支援設定訊息的過期時間,在訊息傳送的時候可以進行指定,每條訊息的過期時間可以不同。

rabbitmq支援設定佇列的過期時間,從訊息入佇列開始計算,直到超過了佇列的超時時間配置,那麼訊息會變成死信,自動清除。

如果兩種方式一起使用,則過期時間以兩者中較小的那個數值為準。

當然也可以不設定ttl,不設定表示訊息不會過期;如果設定為0,則表示除非此時可以直接將訊息投遞到消費者,否則該訊息將被立即丟棄。

2、訊息確認:

為了保證訊息從佇列可靠地到達消費者,rabbitmq提供了訊息確認機制。消費者訂閱佇列的時候,可以指定autoack引數,當autoack為true的時候,rabbitmq採用自動確認模式,rabbitmq自動把傳送出去的訊息設定為確認,然後從記憶體或者硬碟中刪除,而不管消費者是否真正消費到了這些訊息。當autoack為false的時候,rabbitmq會等待消費者回覆的確認訊號,收到確認訊號之後才從記憶體或者磁碟中刪除訊息。

訊息確認機制是rabbitmq訊息可靠性投遞的基礎,只要設定autoack引數為false,消費者就有足夠的時間處理訊息,不用擔心處理訊息的過程中消費者程序掛掉後訊息丟失的問題。

3、持久化:

訊息的可靠性是rabbitmq的一大特色,那麼rabbitmq是如何保證訊息可靠性的呢?答案就是訊息持久化。持久化可以防止在異常情況下丟失資料。rabbitmq的持久化分為三個部分:交換器持久化、佇列持久化和訊息的持久化。

交換器持久化可以通過在宣告佇列時將durable引數設定為true。如果交換器不設定持久化,那麼在rabbitmq服務重啟之後,相關的交換器元資料會丟失,不過訊息不會丟失,只是不能將訊息傳送到這個交換器了。

佇列的持久化能保證其本身的元資料不會因異常情況而丟失,但是不能保證內部所儲存的訊息不會丟失。要確保訊息不會丟失,需要將訊息設定為持久化。佇列的持久化可以通過在宣告佇列時將durable引數設定為true。

設定了佇列和訊息的持久化,當rabbitmq服務重啟之後,訊息依然存在。如果只設定佇列持久化或者訊息持久化,重啟之後訊息都會消失。

當然,也可以將所有的訊息都設定為持久化,但是這樣做會影響rabbitmq的效能,因為磁碟的寫入速度比記憶體的寫入要慢得多。對於可靠性不是那麼高的訊息可以不採用持久化處理以提高整體的吞吐量。魚和熊掌不可兼得,關鍵在於選擇和取捨。在實際中,需要根據實際情況在可靠性和吞吐量之間做乙個權衡。

4、死信佇列:

當訊息在乙個佇列中變成死信之後,他能被重新傳送到另乙個交換器中,這個交換器成為死信交換器,與該交換器繫結的佇列稱為死信佇列。訊息變成死信有下面幾種情況:

死信佇列有什麼用呢?當發生異常的時候,訊息不能夠被消費者正常消費,被加入到了死信佇列中。後續的程式可以根據死信佇列中的內容分析當時發生的異常,進而改善和優化系統。

5、延遲佇列:

一般的佇列,訊息一旦進入佇列就會被消費者立即消費。延遲佇列就是進入該佇列的訊息會被消費者延遲消費,延遲佇列中儲存的物件是「延遲訊息」,「延遲訊息」是指當訊息被傳送以後,等待特定的時間後,消費者才能拿到這個訊息進行消費。

延遲佇列用於需要延遲工作的場景。最常見的使用場景:**或者天貓我們都使用過,使用者在下單之後通常有30分鐘的時間進行支付,如果這30分鐘之內沒有支付成功,那麼訂單就會自動取消。除了延遲消費,延遲佇列的典型應用場景還有延遲重試。比如消費者從佇列裡面消費訊息失敗了,可以延遲一段時間以後進行重試。

**:

RabbitMQ系列教程 C

rabbitmq系列教程之七 rabbitmq的 c 客戶端 api 的簡介 rabbitmq系列教程之六 遠端過程呼叫 rpc rabbitmq系列教程之五 主題 topic rabbitmq系列教程之四 路由 routing rabbitmq系列教程之三 發布 訂閱 publish subscr...

RabbitMQ系列 五 高階特性

一 confirm機制 confirm就是訊息確認,當producer傳送訊息,如果broker收到訊息,會回覆乙個應答,我們可以以此來確認訊息是否成功送達,是保證 訊息可靠性投遞的核心保障 producer 如下,只需要修改producer端,而consumer端不需要修改 4 指定我們的訊息投遞...

RabbitMQ系列 二 基礎元件

rabbitmq是開源 和佇列伺服器,通過普通協議在不同的應用之間共享資料,使用erlang編寫 erlang進行資料交換的效能很好,和原生socket 一樣好的延遲響應效果 基於amqp協議 amqp高階訊息佇列協議 具有現代特徵的二進位制協議,和jms有點像,模型如下 amqp核心概念 1 se...