問題概覽
目前主流的消息隊列技術(shù)(MQ技術(shù))分為RabbitMQ和Kafka,其中深藍色為只要是MQ,一般都會問到的問題。淺藍色是針對RabbitMQ的特性的問題。藍紫色為針對Kafka的特性的問題。
MQ的應(yīng)用場景
MQ主要提供的功能為:異步 解耦 削峰 。
展開來講就是
- 異步發(fā)送(驗證碼、短信、郵件…)
- MYSQL和Redis/ES之間的數(shù)據(jù)同步
- 分布式事務(wù)
- 削峰填谷
RabbitMQ如何保證消息不丟失
RabbitMQ的工作流程應(yīng)該如下,其中每個環(huán)節(jié)都可能導(dǎo)致消息丟失。
publisher叫做發(fā)布者,也可叫做生產(chǎn)者。consumer叫做消費者。
生產(chǎn)者確認機制(解決消息未到達交換機或隊列的問題)
生產(chǎn)者確認機制是用來確認生產(chǎn)者將消息發(fā)送給交換器,交換器傳遞給隊列的過程中,消息是否成功投遞的。發(fā)送確認分為兩步,一是確認是否到達交換器,二是確認是否到達隊列。
如果沒有成功到達交換器,那么就會返回一個nack publish-confirm
如果沒有成功到達隊列,那么就會返回一個ack publish-return
那確認消息發(fā)送失敗之后如何處理捏?
一般有以下三種做法:
- 回調(diào)方法即時重發(fā)
- 記錄日志
- 保存到數(shù)據(jù)庫然后定時重發(fā),成功發(fā)送后即刻刪除表中的數(shù)據(jù)
持久化技術(shù)(解決消息在隊列中丟失的問題)
MQ默認是內(nèi)存存儲消息,需要持久化。分為交換機持久化、隊列持久化和消息持久化,都通過代碼來完成。
消費者確認機制(解決消息未到達消費者的問題)
RabbitMQ支持消費者確認機制,即:消費者處理消息后可以向MQ發(fā)送ack回執(zhí),MQ收到ack回執(zhí)后才會刪除該消息。而SpringAMQP則允許配置三種確認模式:
- manual:手動ack,需要在業(yè)務(wù)代碼結(jié)束后,調(diào)用api發(fā)送ack。
- auto:自動ack,由spring監(jiān)測listener代碼是否出現(xiàn)異常,沒有異常則返回ack;拋出異常則返回nack
- none:關(guān)閉ack,MQ假定消費者獲取消息后會成功處理,因此消息投遞后立即被刪除。
在實際生產(chǎn)場景中使用的是auto模式。
如果確認消息丟失了怎么辦捏?
我們可以利用Spring的retry機制,在消費者出現(xiàn)異常時利用本地重試,設(shè)置重試次數(shù),當(dāng)次數(shù)達到了以后,如果消息依然失敗,將消息投遞到異常交換機,交由人工處理。
常見問題和回答模板
RabbitMQ如何保證消息不丟失?
回答:(背熟以下回答大概用時2min)
RabbitMQ分別提供了三個機制,第一個是生產(chǎn)者確認機制,用來保證消息成功到達交換機,且成功到達隊列。第二個是持久化機制,用來保證消息不在隊列中丟失。第三個是消費者確認機制,用來保證消息成功到達消費者。通過以上三種機制可以綜合保證消息不丟失。
首先是生產(chǎn)者確認機制,如果消息未能成功到達交換機,那么就返回nack publish-confirm,如果消息未能成功到達隊列,那么就返回ack publish-return。通過返回的信號不同,我們可以判斷具體是哪個環(huán)節(jié)出了問題并采取對應(yīng)手段,譬如:用回調(diào)方法即使重發(fā)或者保存到數(shù)據(jù)庫然后定時重發(fā)等。
然后是持久化機制,因為MQ是基于內(nèi)存的存儲,所以我們需要持久化來保證消息不會在隊列中丟失。我們一共需要持久化三部分,分別是交換機、隊列和消息本身,都是通過代碼完成的。文章來源:http://www.zghlxwxcb.cn/news/detail-821240.html
最后是消費者確認機制,只有消費者接受到消息并返回ack信號后,RabbitMQ才會刪除該消息。框架一般支持自動確認、手動確認和不確認三種模式。我們一般選的都是自動確認。如果確認發(fā)現(xiàn)消息在這個環(huán)節(jié)丟失,那么也會有相應(yīng)的retry機制。文章來源地址http://www.zghlxwxcb.cn/news/detail-821240.html
到了這里,關(guān)于消息中間件之八股面試回答篇:一、問題概覽+MQ的應(yīng)用場景+RabbitMQ如何保證消息不丟失(生產(chǎn)者確認機制、持久化、消費者確認機制)+回答模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!