<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
生產者弄丟了資料。生產者將資料傳送到 RabbitMQ 的時候,可能資料就在半路給搞丟了,因為網路問題啥的,都有可能。
RabbitMQ 弄丟了資料。MQ還沒有持久化自己掛了
消費端弄丟了資料。剛消費到,還沒處理,結果程序掛了,比如重啟了。
可以選擇用 RabbitMQ 提供的事務功能,就是生產者傳送資料之前開啟 RabbitMQ 事務channel.txSelect,然後傳送訊息,如果訊息沒有成功被 RabbitMQ 接收到,那麼生產者會收到異常報錯,此時就可以回滾事務channel.txRollback,然後重試傳送訊息;如果收到了訊息,那麼可以提交事務channel.txCommit。
// 開啟事務 channel.txSelect try { // 這裡傳送訊息 } catch (Exception e) { channel.txRollback // 這裡再次重發這條訊息 } // 提交事務 channel.txCommit
缺點:
RabbitMQ 事務機制是同步的,你提交一個事務之後會阻塞在那兒,採用這種方式基本上吞吐量會下來,因為太耗效能。
事務機制和 confirm 機制最大的不同在於,事務機制是同步的,你提交一個事務之後會阻塞在那兒,但是 confirm 機制是非同步的
在生產者開啟了confirm模式之後,每次寫的訊息都會分配一個唯一的id,然後如果寫入了rabbitmq之中,rabbitmq會給你回傳一個ack訊息,告訴你這個訊息傳送OK了;如果rabbitmq沒能處理這個訊息,會回撥你一個nack介面,告訴你這個訊息失敗了,你可以進行重試。而且你可以結合這個機制知道自己在記憶體裡維護每個訊息的id,如果超過一定時間還沒接收到這個訊息的回撥,那麼你可以進行重發。
//開啟confirm channel.confirm(); //傳送成功回撥 public void ack(String messageId){ } // 傳送失敗回撥 public void nack(String messageId){ //重發該訊息 }
說三點:
(1)要保證rabbitMQ不丟失訊息,那麼就需要開啟rabbitMQ的持久化機制,即把訊息持久化到硬碟上,這樣即使rabbitMQ掛掉在重啟後仍然可以從硬碟讀取訊息;
(2)如果rabbitMQ單點故障怎麼辦,這種情況倒不會造成訊息丟失,這裡就要提到rabbitMQ的3種安裝模式,單機模式、普通叢集模式、映象叢集模式,這裡要保證rabbitMQ的高可用就要配合HAPROXY做映象叢集模式
(3)如果硬碟壞掉怎麼保證訊息不丟失
RabbitMQ 的訊息預設存放在記憶體上面,如果不特別宣告設定,訊息不會持久化儲存到硬碟上面的,如果節點重啟或者意外crash掉,訊息就會丟失。
所以就要對訊息進行持久化處理。如何持久化,下面具體說明下:
要想做到訊息持久化,必須滿足以下三個條件,缺一不可。
1) Exchange 設定持久化
2)Queue 設定持久化
3)Message持久化傳送:傳送訊息設定傳送模式deliveryMode=2,代表持久化訊息
我們先來介紹下RabbitMQ三種部署模式:
1)單節點模式:最簡單的情況,非叢集模式,節點掛了,訊息就不能用了。業務可能癱瘓,只能等待。
2)普通模式:訊息只會存在與當前節點中,並不會同步到其他節點,當前節點宕機,有影響的業務會癱瘓,只能等待節點恢復重啟可用(必須持久化訊息情況下)。
3)映象模式:訊息會同步到其他節點上,可以設定同步的節點個數,但吞吐量會下降。屬於RabbitMQ的HA方案
為什麼設定映象模式叢集,因為佇列的內容僅僅存在某一個節點上面,不會存在所有節點上面,所有節點僅僅存放訊息結構和後設資料。下面自己畫了一張圖介紹普通叢集丟失訊息情況:
如果想解決上面途中問題,保證訊息不丟失,需要採用HA 映象模式佇列。
下面介紹下三種HA策略模式:
1)同步至所有的
2)同步最多N個機器
3)只同步至符合指定名稱的nodes
命令處理HA策略模版:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
1)為每個以“rock.wechat”開頭的佇列設定所有節點的映象,並且設定為自動同步模式
rabbitmqctl set_policy ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
rabbitmqctl set_policy -p rock ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
2)為每個以“rock.wechat.”開頭的佇列設定兩個節點的映象,並且設定為自動同步模式
rabbitmqctl set_policy -p rock ha-exacly "^rock.wechat"
'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
3)為每個以“node.”開頭的佇列分配指定的節點做映象
rabbitmqctl set_policy ha-nodes "^nodes."
'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
但是:HA 映象佇列有一個很大的缺點就是: 系統的吞吐量會有所下降
為什麼還要訊息補償機制呢?難道訊息還會丟失,沒錯,系統是在一個複雜的環境,不要想的太簡單了,雖然以上的三種方案,基本可以保證訊息的高可用不丟失的問題,
但是作為有追求的程式設計師來講,要絕對保證我的系統的穩定性,有一種危機意識。
比如:持久化的訊息,儲存到硬碟過程中,當前佇列節點掛了,儲存節點硬碟又壞了,訊息丟了,怎麼辦?
1)生產端首先將業務資料以及訊息資料入庫,需要在同一個事務中,訊息資料入庫失敗,則整體回滾。
2)根據訊息表中訊息狀態,失敗則進行訊息補償措施,重新傳送訊息處理。
方案一:ACK確認機制
多個消費者同時收取訊息,比如訊息接收到一半的時候,一個消費者死掉了(邏輯複雜時間太長,超時了或者消費被停機或者網路斷開連結),如何保證訊息不丟?
使用rabbitmq提供的ack機制,伺服器端首先關閉rabbitmq的自動ack,然後每次在確保處理完這個訊息之後,在程式碼裡手動呼叫ack。這樣就可以避免訊息還沒有處理完就ack。才把訊息從記憶體刪除。
這樣就解決了,即使一個消費者出了問題,但不會同步訊息給伺服器端,會有其他的消費端去消費,保證了訊息不丟的case。
如果需要保證訊息在整條鏈路中不丟失,那就需要生產端、mq自身與消費端共同去保障。
生產端:對生產的訊息進行狀態標記,開啟confirm機制,依據mq的響應來更新訊息狀態,使用定時任務重新投遞超時的訊息,多次投遞失敗進行報警。
mq自身:開啟持久化,並在落盤後再進行ack。如果是映象部署模式,需要在同步到多個副本之後再進行ack。
消費端:開啟手動ack模式,在業務處理完成後再進行ack,並且需要保證冪等。
通過以上的處理,理論上不存在訊息丟失的情況,但是系統的吞吐量以及效能有所下降。
在實際開發中,需要考慮訊息丟失的影響程度,來做出對可靠性以及效能之間的權衡。
到此這篇關於一文看懂RabbitMQ訊息丟失如何防止的文章就介紹到這了,更多相關RabbitMQ訊息丟失如何防止內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45