RabbitMQ常見問題以及解決措施

2021-10-10 22:05:15 字數 1408 閱讀 9453

rabbitmq訊息丟失

這個是rabbitmq最常見的問題,rabbitmq丟失分三種情況,生產者訊息丟失,rabbitmq訊息丟失,消費者訊息丟失.

生產者訊息丟失

生產者在傳送訊息給rabbitmq,在中途有可能因為網路問題導致訊息丟失,我們可以選擇rabbitmq提供的事務,也可以用confirm模式,就是生產者確認

事務:channel.tsselect開啟事務;

channel.txrollback出現問題事務回滾

channel.txcommit成功後提交事務

confirm模式:

生產者傳送訊息,每個訊息分配乙個id,如果rabbitmq接收到訊息返回ack,如果沒有收到放回nack,這個時候生產者只需要重新傳送這個訊息即可,可以結合這個機制在記憶體裡設定訊息id的狀態,多長時間沒有f返回ack就是失敗,重新傳送訊息.

事務和confirm對比:

事務是屬於同步的,在你提交乙個事務會阻塞在那裡,其他的訊息是不能繼續傳送的,這樣很容易影響效能,而confirm是非同步的就是傳送完我可以繼續傳送另一條訊息,在正常使用中推薦使用confirm模式

rabbitmq訊息丟失

rabbitmq資料丟失,可以用持久化分為兩個步驟:

首選建立queue的時候將其設定為持久化,這樣可以保證rabbitmq持久化queue的元資料,而不會持久化queue的資料,第二步將訊息的deliverymode設定為2,就是將訊息設定為持久化,此時訊息就會持久化到磁碟上,即使rabbitmq重啟,也會從磁碟上恢復queue,恢復queue裡的資料

跟生產者的confirm配合,如過持久化到磁碟上再返回ack,如果還沒持久化就rabbitmq掛掉了,生產者沒有收到ack,還是會重新傳送訊息.

消費者訊息丟失

消費者有可能因為剛接到訊息還沒有處理就重啟了,但是rabbitmq以為他處理了,這樣就會導致訊息丟失,合理的解決方案是關閉自動ack,可以通過api來進行呼叫,等自己的**處理完成之後,可以ack,這樣即使你沒有消費rabbitmq也知道你是沒有去消費的,這個時候rabbitmq可以把訊息交給其他的consumer進行消費,避免訊息丟失

如何保證重複消費

全域性唯一id+redis,首先生產者在傳送訊息時,為每條訊息設定乙個全域性唯一的messageid,消費者拿到訊息後,使用setnx命令,將messageid作為key放到redis中:setnx(messageid,1),若返回1,說明之前沒有消費過,正常消費;若返回0,說明這條訊息之前已消費過,拋棄。

如何保證順序消費

將乙個queue拆分為了多個queue,這樣一來,乙個consumer對應乙個queue,或者就乙個queue但是對應乙個consumer,然後這個consumer內部用記憶體佇列做排隊,然後分發給底層不同的worker來處理

RabbitMq常見問題

什麼是rabbitmq?為什麼要使用rabbitmq?訊息佇列的優缺點?rabbitmq 的使用場景有哪些?rabbitmq 有哪些重要的角色?rabbitmq 有哪些重要的元件?rabbitmq 中 vhost 的作用是什麼?rabbitmq 的訊息是怎麼傳送的?rabbitmq 怎麼保證訊息的穩...

最全RabbitMQ教程4 常見問題

二 如何保證訊息冪等?三 如何保證訊息的順序?這是面試時最喜歡問的問題,其實這個是所有mq的乙個共性的問題,大致的解決思路也是差不多的,但是針對不同的mq產品會有不同的解決方案。之前針對rocketmq做過分析,我們再按照rabbitmq來分析下這個問題。我們考慮乙個通用的mq場景 其中,1,2,4...

VNC配置,以及常見問題

兩天搭安全試驗的環境,在vmware上安裝了ubuntu 10.10 以前用過,最早用的好像是6系列吧 安裝好後想用遠端桌面控制,畢竟在vmware上看到的介面比較小,不太方便。在安裝上vnc,做了一些配置 vnc使用gnome seeion啟動 後,使用時出了兩個問題 1.從遠端使用vncview...