掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
市場上現(xiàn)在常用的消息隊列有:RabbitMQ、RocketMQ、Kafka,ActiveMQ。

使用消息MQ后,只需要保證消息格式不變,不需要關心發(fā)布者及消費者之間的關系,這兩者不需要彼此聯(lián)系。
在一些不需要即時(同步)的返回結果操作,通過消息隊列來實現(xiàn)異步。
在大量請求時(秒殺場景),使用消息隊列做緩沖處理,削弱峰值流量,防止系統(tǒng)在短時間內(nèi)被峰值流量沖垮。
場景:在大量流量涌入高峰,如數(shù)據(jù)庫只能抗住2000的并發(fā)流量,可以使用MQ控制2000到數(shù)據(jù)庫中。
日志存儲在消息隊列中,用來處理日志,比如kafka。
在還未引進MQ之前,系統(tǒng)只需要關系生產(chǎn)端與消費端的接口一致性就可以了,現(xiàn)在引進后,系統(tǒng)需要關注生產(chǎn)端、MQ與消費端三者的穩(wěn)定性,這增加系統(tǒng)的負擔,系統(tǒng)運維成本增加。
引入了MQ,需要考慮的問題就增加了,如何保障消息的一致性,消費不被重復消費等問題。
A系統(tǒng)發(fā)送完消息直接返回成功,但是BCD系統(tǒng)之中若有系統(tǒng)寫庫失敗,則會產(chǎn)生數(shù)據(jù)不一致的問題。
冪等性:就是用戶對于同一操作發(fā)起的一次請求或者多次請求的結果是一致的,不會因為多次點擊而產(chǎn)生了副作用。
我們先來了解一下產(chǎn)生消息重復消費的原因,對于MQ的使用,有三個角色:生產(chǎn)者、MQ、消費者,那么消息的重復這三者會出現(xiàn):
在正常情況下,生產(chǎn)者是客戶,我們很難避免出現(xiàn)用戶重復點擊的情況,而MQ是允許存在多條一樣的消息,但消費者是不允許出現(xiàn)消費兩條一樣的數(shù)據(jù),所以冪等性一般是在消費端實現(xiàn)的:
狀態(tài)判斷:消費者把消費消息記錄到redis中,再次消費時先到redis判斷是否存在該數(shù)據(jù),存在則表示消費過,直接丟棄。
業(yè)務判斷:消費完數(shù)據(jù)后,都是需要插入到數(shù)據(jù)庫中,使用數(shù)據(jù)庫的唯一約束防止重復消費。插入數(shù)據(jù)庫前先查詢是否存在該數(shù)據(jù),存在則直接丟棄消息,這種方式是比較簡單粗暴地解決問題。
在生產(chǎn)端發(fā)布消息時,每次法發(fā)布消息都把上一條消息的ID記錄到消息體中,消費者接收到消息時,做如下操作。
根據(jù)消息重要程度,可以分為兩種情況處理:

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流