《RabbitMQ》如何保證訊息的可靠性

2021-10-08 21:17:19 字數 2191 閱讀 8488

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 ...