消息隊列:消息可靠性、重復(fù)消息、消息積壓、利用消息實現(xiàn)分布式事務(wù)

- 如何確保消息不丟失 -
1、檢測消息丟失的方法
如果是在一個分布式系統(tǒng)中實現(xiàn)這個檢測方法,有幾個問題需要注意:
2、確保消息可靠傳遞

2.1、生產(chǎn)階段
try{
producer.send(record).get();
System.out.println("消息發(fā)送成功");
} catch(Exception e) {
System.out.println("消息發(fā)送失敗");
System.out.println(e);
}
異步發(fā)送時,則需要在回調(diào)方法里進行檢查:
producer.send(record, newCallback() {
@Override
publicvoid onCompletion(RecordMetadata metadata, Exception exception) {
if(metadata != null) {
System.out.println("消息發(fā)送成功");
} else{
System.out.println("消息發(fā)送失敗");
System.out.println(exception);
}
}
});
producer.send(record, (metadata, exception) -> {
if(metadata != null) {
System.out.println("消息發(fā)送成功");
} else{
System.out.println("消息發(fā)送失敗");
System.out.println(exception);
}
});
2.2、存儲階段
2.3、消費階段


- 小結(jié) -

- 如何處理消費過程中的重復(fù)消息 -
1、消息重復(fù)的情況必然存在
2、用冪等性解決重復(fù)消息問題
幾種常用的設(shè)計冪等操作的方法

- 如何處理消息積壓? -
優(yōu)化性能來避免消息積壓
發(fā)送端準備數(shù)據(jù)、序列化消息、構(gòu)造請求等邏輯的時間,也就是發(fā)送端在網(wǎng)絡(luò)請求之前的耗時;
發(fā)送消息和返回響應(yīng)在網(wǎng)絡(luò)傳輸中的耗時;
Broker處理消息的時延。
消息積壓了該如何處理?

- 利用事務(wù)消息實現(xiàn)分布式事務(wù) -
這個過程中有一個需要用到消息隊列的步驟,訂單系統(tǒng)創(chuàng)建訂單后,發(fā)消息給購物車系統(tǒng),將已下單的商品從購物車中刪除。因為從購物車刪除已下單商品這個步驟,并不是用戶下單支付這個主要流程中必需的步驟,使用消息隊里來異步清理購物車是更加合理的設(shè)計。

什么是分布式事務(wù)?
原子性:指一個事務(wù)操作不可分割,要么成功,要么失敗,不能有一半成功一半失敗的情況。
一致性:指這些數(shù)據(jù)在事務(wù)執(zhí)行完成這個時間點之前,讀到的一定是更新前的數(shù)據(jù),之后讀到的一定是更新后的數(shù)據(jù),不應(yīng)該存在一個時刻,讓用戶讀到更新過程中的數(shù)據(jù)。
隔離性:指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對正在進行的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
持久性:指一個事務(wù)一旦完成提交,后續(xù)的其他操作和故障都不會對事務(wù)的結(jié)果產(chǎn)生任何影響 事務(wù)消息適用的場景主要是那些需要異步更新數(shù)據(jù),并且對數(shù)據(jù)實時性要求不太高的場景。比如訂單系統(tǒng)的例子,在創(chuàng)建訂單后,如果出現(xiàn)短暫的幾秒,購物車里的商品沒有及時情況,也不是完全不可接受的,只要最終購物車的數(shù)據(jù)和訂單數(shù)據(jù)保持一致就可以了。
2、消息隊列是如何實現(xiàn)分布式事務(wù)的?

3、RocketMQ中的分布式事務(wù)實現(xiàn)
這種情況下,即使是發(fā)送事務(wù)消息的那個訂單服務(wù)節(jié)點宕機了,RocketMQ依然可以通過其他訂單服務(wù)的節(jié)點來執(zhí)行反查,確保事務(wù)的完整性。

作者:邋遢的流浪劍客
來源:
https://blog.csdn.net/qq_40378034/article/details/98790433

