rabbitmq怎么解決重復(fù)消費(fèi)的 rabbitmq持久化原理?
rabbitmq持久化原理?rabbitmq不易脫妝化分為三個(gè)部分:交換器的持久化、隊(duì)列的自然持久化和消息的持久度化。隊(duì)列不易脫妝化是定義在隊(duì)列的durable參數(shù)來實(shí)現(xiàn)的,durable為true時(shí)
rabbitmq持久化原理?
rabbitmq不易脫妝化分為三個(gè)部分:交換器的持久化、隊(duì)列的自然持久化和消息的持久度化。
隊(duì)列不易脫妝化是定義在隊(duì)列的durable參數(shù)來實(shí)現(xiàn)的,durable為true時(shí),隊(duì)列才會(huì)自然持久化。
消息不持久化這個(gè)可以實(shí)際消息屬性deliveryMode來設(shè)置中是否自然持久化,在發(fā)送消息時(shí)通過basicPublish的參數(shù)傳入。
同隊(duì)列一般,交換器也需要在定義時(shí)設(shè)置里持久化標(biāo)識(shí),不然在Broker重啟后后將全部丟失。
JAVA面試如何保證消息不被重復(fù)消費(fèi)?如何保證消息消費(fèi)的冪等性?
你的問題都在問一個(gè)核心思想:網(wǎng)絡(luò)帶寬是不比較可靠的。
如果不是你知道這一點(diǎn),就估計(jì)相信沒能絕對的保證消息不再重復(fù)一遍消費(fèi)。即重復(fù)的消息和調(diào)用無可避免。
既然無法避免,那么就和現(xiàn)實(shí)要做的事情是有有矛盾。實(shí)際情況是,用戶只不過自己手機(jī)信號不好支付三次我失敗了后,是不如果能扣兩次費(fèi)用的。
怎莫解決這個(gè)矛盾呢?很簡單:“很痛快相信,不能容忍一次”。
具體來說,你在實(shí)現(xiàn)方法消息消費(fèi)程序時(shí),將有時(shí)候動(dòng)態(tài)創(chuàng)建都拿出來“再重復(fù)一遍全局函數(shù)”來處理。重復(fù)的動(dòng)態(tài)鏈接庫一定會(huì)都回最終。要能夠做到這一點(diǎn),你需要精心設(shè)計(jì)一個(gè)“僅有id”,來保證它的含義和你做的業(yè)務(wù)含義是極為相似的。即“同一件事的id一定同一;又不是同一件事id一定會(huì)有所不同”。
這樣,是對同一個(gè)id,無論是內(nèi)部函數(shù)多少次,你的應(yīng)答大都已經(jīng)不同(沒有必要時(shí)是可以告知他也過一次了),這應(yīng)該是冪等的內(nèi)涵。