第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

1. 前言

上個(gè)小節(jié)中我們介紹了 RabbitMQ 中如何防止消息丟失,即保證消息發(fā)送的 At Least Once 性質(zhì),除此之外,如何防止消息被重復(fù)消費(fèi),即保證消息消費(fèi)的 Exactly Once 性質(zhì),也是業(yè)務(wù)邏輯中需要考慮的問(wèn)題。

2. 消息消費(fèi)順序

面試官提問(wèn):業(yè)務(wù)中使用了 RabbitMQ 消息隊(duì)列,如何保證消息的順序消費(fèi)?

題目解析

保證消息的順序消費(fèi)是業(yè)務(wù)場(chǎng)景下經(jīng)常面臨的挑戰(zhàn),可能在面試中會(huì)涉及到一些實(shí)戰(zhàn)場(chǎng)景,例如電商的下單邏輯,在用戶下單之后,會(huì)發(fā)送創(chuàng)建訂單和扣減庫(kù)存的消息,我們需要保證扣減庫(kù)存在創(chuàng)建訂單之后執(zhí)行。

在MQ層面支持消息的順序消費(fèi)是一件開銷很大的操作,例如使用事務(wù),所以除非特定場(chǎng)景,一般不在 RabbitMQ 消息傳輸?shù)讓又С猪樞?。在上層即?yīng)用層處理業(yè)務(wù)邏輯是常規(guī)操作,有兩種通用解決方案:

(1)同步發(fā)送消息:將消息發(fā)送從異步模式切換為同步模式,例如先發(fā)送創(chuàng)建訂單消息,當(dāng)創(chuàng)建訂單的下游消費(fèi)者發(fā)送ACK確認(rèn)成功消費(fèi)后,再發(fā)送扣減庫(kù)存的消息;
(2)消息實(shí)體增加冗余字段:例如增加 version(版本號(hào))、 msg_id(消息id),保證在扣減庫(kù)存時(shí),對(duì)應(yīng) msg_id 的訂單已經(jīng)創(chuàng)建成功,實(shí)戰(zhàn)中配合Redis等緩存協(xié)助判斷。

3. 消息重復(fù)消費(fèi)

面試官提問(wèn):RabbitMQ 如何保證消息不會(huì)被重復(fù)消費(fèi)?

題目解析:

所有的消息隊(duì)列都要保證同一條消息不會(huì)被重復(fù)消費(fèi),RabbitMQ 重復(fù)消費(fèi)消息的可能場(chǎng)景主要有兩種:

(1)生產(chǎn)者重復(fù)發(fā)送消息:生產(chǎn)者在往消息隊(duì)列發(fā)送消息時(shí),發(fā)生了網(wǎng)絡(luò)抖動(dòng),生產(chǎn)者沒(méi)有收到確認(rèn)信號(hào),但是實(shí)際上消息隊(duì)列已經(jīng)收到了消息,超過(guò)一定時(shí)間后生產(chǎn)者會(huì)重新發(fā)送消息,這時(shí)一條消息被發(fā)送了兩次;
(2)消費(fèi)者重復(fù)接受消息:消費(fèi)者成功消費(fèi)消息后,發(fā)生了網(wǎng)絡(luò)抖動(dòng),消息隊(duì)列沒(méi)有收到確認(rèn)信號(hào),超過(guò)一段時(shí)間后會(huì)重新給消費(fèi)者投遞相同的消息,同一條消息即存在被消費(fèi)兩次的可能。

通用解決方案是在消息實(shí)體中添加全局唯一的id,例如 msg_id(消息ID),在業(yè)務(wù)邏輯層保證消息的冪等性,具體參考步驟:

(1)消費(fèi)者在收到消息之后,根據(jù) msg_id 從緩存/數(shù)據(jù)庫(kù)中查詢是否存在已有消息;
(2)如果不存在已有消息,那么消費(fèi)之后,將 msg_id 對(duì)應(yīng)的消息實(shí)體或者序列化對(duì)象寫入緩存/數(shù)據(jù)庫(kù);
(3)如果存在已有消息,說(shuō)明這條消息已被消費(fèi)過(guò),丟棄消息并且打一條告警日志。

并且可以根據(jù)重復(fù)消費(fèi)的容忍程度以及性能要求選擇使用緩存還是使用數(shù)據(jù)庫(kù),如果對(duì)判斷的速度要求高,可以使用 Redis 作為緩存;如果對(duì)判斷的穩(wěn)定性和魯棒性要求高,使用數(shù)據(jù)庫(kù)存儲(chǔ)消息實(shí)體,同時(shí)將 msg_id 作為數(shù)據(jù)庫(kù)表的唯一鍵,插入重復(fù)記錄一定會(huì)拋出異常,避免數(shù)據(jù)庫(kù)因?yàn)椴l(fā)問(wèn)題產(chǎn)生臟數(shù)據(jù),保證了消息消費(fèi)的不可重復(fù)性。

4. 小結(jié)

本章節(jié)介紹了 RabbitMQ 中最常見的重復(fù)發(fā)送消息的實(shí)際場(chǎng)景,并且給出了添加全局唯一 ID 的通用性解決方案,候選人需要理解通過(guò)全局 ID 解決重復(fù)消息的核心邏輯,準(zhǔn)備時(shí)間充裕的情況可以在本地環(huán)境編碼實(shí)現(xiàn)上述流程。