RabbitMQ原理之訊息持久化

2022-09-24 01:24:08 字數 1402 閱讀 6499

現在聊一下rabbitmq訊息持久化:

1.當有多個消費者同時收取訊息,且每個消費者在接收訊息的同時,還要處理其它的事情,且會消耗很長的時間。在此過程中可能會出現一些意外,比如訊息接收到一半的時候,乙個消費者死掉了。

這種情況要使用訊息接收確認機制,可以執行上次宕機的消費者沒有完成的事情。

2.在預設情況下,我們程式建立的訊息佇列以及存放在佇列裡面的訊息,都是非持久化的。當rabbitmq死掉了或者重啟了,上次建立的佇列、訊息都不會儲存。

這種情況可以使用rabbitmq提供的訊息佇列的持久化機制。

rabbitmq支援訊息的持久化,也就是資料寫在磁碟上,為了資料安全考慮,我個人覺得大多數開發人員都會選擇持久化。

佇列和交換機有乙個建立時候指定的標誌durable。durable的唯一含義就是具有這個標誌的佇列和交換機會在重啟之後重新建立,它不表示說在佇列當中的訊息會在重啟後恢復。

訊息佇列持久化包括3個部分:

1、exchange持久化,在宣告時指定durable => true

2、queue持久化,在宣告時指定durable => true

3、訊息持久化,在投遞時指定delivery_mode=> 2(1是非持久化)

如果exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。如果exchange和queue兩者之間有乙個持久化,乙個非持久化,就不允許建立繫結。

注意:一旦建立了佇列和交換機,就不能修改其標誌了。例如,如果建立了乙個non-durable的佇列,然後想把它改變成durable的,唯一的辦法就是刪除這個佇列然後重現建立。

view code

注:ack是acknowledgments的縮寫,noack 是("no manual acks")

因為我前段時間換了筆記本,所以使用者的「eric」的操作出踩了個坑,下面進行介紹下:

如果除錯執行時報錯:none of the specified endpoints were reachable

innerexception是:

這說明我們使用的使用者 不是 系統預設的guest而是我們自己建立的使用者,但是沒有足夠的許可權進行操作。

解決辦法:

rabbitmqctl set_user_tags username administrator

rabbitmqctl set_permissions -p / username ".*" ".*" ".*"

執行結果:

相關其他操作見:windows下 安裝 rabbitmq 及操作常用命令

程式執行結果:

view code

接受訊息還有一種方法,就是通過基於推送的事件訂閱。可以使用內建的queueingbasicconsumer提供簡化的程式設計模型,允許在共享佇列上阻塞,直到收到一條訊息。

view code

程式執行結果:

rabbitmq 訊息持久化

專案案例 channel.exchangedeclare my exchange,builtinexchangetype.topic,true durable 引數設定為 truechannel.queuedeclare my queue,true,false,false maps.newhashm...

RabbitMQ訊息持久化

三 訊息持久化 四 總結 回到頂部 一 前言 如果我們希望即使在rabbitmq服務重啟的情況下,也不會丟失訊息,我們可以將queue與message都設定為可持久化的 durable 這樣可以保證絕大部分情況下我們的rabbitmq訊息不會丟失。當然還是會有一些小概率事件會導致訊息丟失。回到頂部 ...

RabbitMQ訊息持久化

如果我們希望即使在rabbitmq服務重啟的情況下,也不會丟失訊息,我們可以將queue與message都設定為可持久化的 durable 這樣可以保證絕大部分情況下我們的rabbitmq訊息不會丟失。當然還是會有一些小概率事件會導致訊息丟失。在windows環境下,在rabbitmq的安裝目錄 s...