1.1 事務機制
amqp協議提供了事務機制,在投遞訊息時開啟事務支援,如果訊息投遞失敗,則回滾事務。
自定義事務管理器
@configuration
public class rabbittranscation
@bean
public rabbittemplate rabbittemplate(connectionfactory connectionfactory)}
修改yml
spring:
rabbitmq:
# 訊息在未被佇列收到的情況下返回
publisher-returns: true
開啟事務支援
rabbittemplate.setchanneltransacted(true);
訊息未接收時呼叫returncallback
rabbittemplate.setmandatory(true);
生產者投遞訊息
@service
public class providertranscation implements rabbittemplate.returncallback
@override
public void returnedmessage(message message, int replycode, string replytext, string exchange, string routingkey)
@transactional(rollbackfor = exception.class,transactionmanager = "rabbittransactionmanager")
public void publishmessage(string message) throws exception }
但是,很少有人這麼幹,因為這是同步操作,一條訊息傳送之後會使傳送端阻塞,以等待rabbitmq-server的回應,之後才能繼續傳送下一條訊息,生產者生產訊息的吞吐量和效能都會大大降低。
1.2 傳送方確認機制
傳送訊息時將通道設定為confirm模式,訊息進入該通道後,都會被指派給乙個唯一id,一旦訊息被投遞到所匹配的佇列後,rabbitmq就會傳送給生產者乙個確認。
開啟訊息確認機制
spring:
rabbitmq:
# 訊息在未被佇列收到的情況下返回
publisher-returns: true
# 開啟訊息確認機制
publisher-confirm-type: correlated
訊息未接收時呼叫returncallback
rabbittemplate.setmandatory(true);
生產者投遞訊息
@service
public class confirmprovider implements rabbittemplate.confirmcallback,rabbittemplate.returncallback
@override
public void confirm(correlationdata correlationdata, boolean ack, string cause) else
}@override
public void returnedmessage(message message, int replycode, string replytext, string exchange, string routingkey)
public void publismessage(string message)}
如果訊息確認失敗後,我們可以進行訊息補償,也就是訊息的重試機制。當未收到確認資訊時進行訊息的重新投遞。設定如下配置即可完成。
spring:
rabbitmq:
# 支援訊息傳送失敗後重返佇列
publisher-returns: true
# 開啟訊息確認機制
publisher-confirm-type: correlated
listener:
******:
retry:
# 開啟重試
enabled: true
# 最大重試次數
max-attempts: 5
# 重試時間間隔
initial-interval: 3000
亞馬遜測評 www.yisuping.com
RabbitMQ 如何保證訊息不丟失?
rabbitmq 如何保證訊息不丟失?rabbitmq一般情況很少丟失,但是不能排除意外,為了保證我們自己系統高可用,我們必須作出更好完善措施,保證系統的穩定性。下面來介紹下,如何保證訊息的絕對不丟失的問題,下面分享的絕對乾貨,都是在知名網際網路產品的產線中使用。1.訊息持久化 2.ack確認機制 ...
Rabbitmq如何保證訊息順序執行
訊息佇列中的若干訊息如果是對同乙個資料進行操作,這些操作具有前後的關係,必須要按前後的順序執行,否則就會造成資料異常。舉例 比如通過mysql binlog進行兩個資料庫的資料同步,由於對資料庫的資料操作是具有順序性的,如果操作順序搞反,就會造成不可估量的錯誤。比如資料庫對一條資料依次進行了 插入 ...
RabbitMQ如何保證訊息不丟失
rabbitmq 大致有三種場景會發生訊息丟失 1 consumer沒有接收到訊息,消費之前 2 consumer接收到訊息,訊息暫存記憶體,還未消費 3 consumer消費時 第一種丟失場景就像我剛剛到達便利店,還沒選好買什麼商品,這個時候便利店突然斷電,無法消費 這種場景下使用message ...