自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:對(duì)于 MQ 中的消息重復(fù)消費(fèi)說說的你的理解

數(shù)據(jù)庫
在消費(fèi)者進(jìn)行消費(fèi)消息時(shí),首先根據(jù)消息唯一標(biāo)識(shí)判斷是否已經(jīng)消費(fèi)過,可以使用 Redis 或者 MySQL 中的唯一索引等方式,然后來判斷該消息是否可以被消費(fèi)。?

今天這是MQ消息消費(fèi)必問面試的第三個(gè)問題,重復(fù)消費(fèi)。如果你還沒有看消息丟失、消息堆積,可以先去點(diǎn)擊鏈接進(jìn)行查看。

面試官:對(duì)于MQ中的消息丟失你是如何理解的?

面試官:對(duì)于MQ中的消息堆積你是怎么理解的?

首先我們先看一下消息重復(fù)消費(fèi)的定義,就是字面意思,一條消息被消費(fèi)執(zhí)行了多次??梢允且粋€(gè)消費(fèi)者消費(fèi)了多次,也可以是多個(gè)消費(fèi)者消費(fèi)了同一條消息。

一、重復(fù)消費(fèi)消息對(duì)系統(tǒng)的影響

消息重復(fù)消費(fèi)可能導(dǎo)致數(shù)據(jù)在數(shù)據(jù)庫中被重復(fù)插入,這其實(shí)還好,重復(fù)插入只要不是影響業(yè)務(wù),在查詢時(shí)去重也可以解決,俗稱治標(biāo)不治本。

如果是通知類消息,用戶可能會(huì)收到多條通知,對(duì)于用戶的體驗(yàn)會(huì)有所影響。

但是消息的重復(fù)消費(fèi)最壞的就是導(dǎo)致數(shù)據(jù)的不一致,如果是訂單類的系統(tǒng),多次消費(fèi)帶來的不一致可能是致命的錯(cuò)誤,例如多次扣款、超賣等。

消息重復(fù)消費(fèi)在系統(tǒng)高并發(fā)的時(shí)候會(huì)嚴(yán)重的影響系統(tǒng)性能,消費(fèi)者吞吐量下降造成消息堆積等。

二、消息發(fā)生重復(fù)消費(fèi)的原因

消息重復(fù)消費(fèi)產(chǎn)生的原因有很多,比如上一篇文章消息堆積中產(chǎn)生消息堆積的原因之一,消費(fèi)者異常多次重試消費(fèi)。

  • 消費(fèi)者在消費(fèi)消息的過程中,業(yè)務(wù)代碼異常一直重試,沒有對(duì)異常行為進(jìn)行控制造成單條消息卡住,一直重復(fù)消費(fèi)。
  • 消費(fèi)者應(yīng)答機(jī)制不合理,在消費(fèi)者處理完業(yè)務(wù)之后無法正常應(yīng)答或者因網(wǎng)絡(luò)原因應(yīng)答失敗。
  • 配置錯(cuò)誤,手動(dòng)ack,消費(fèi)者消費(fèi)完成之后沒有成功ack。

三、消息重復(fù)消費(fèi)解決方案

  • 合理配置應(yīng)答機(jī)制,手動(dòng)應(yīng)答,消費(fèi)者業(yè)務(wù)處理盡量簡單,對(duì)各種異常做好處理,增強(qiáng)應(yīng)用系統(tǒng)健壯性。
  • 消息重試次數(shù)增加限制,防止消息一直重試。
  • MQ中配置合理的消息語義,保證至少一次,然后業(yè)務(wù)端做好去重。
  • 增加消息唯一標(biāo)識(shí),消費(fèi)過的消息不在進(jìn)行處理。
  • 消費(fèi)端業(yè)務(wù)邏輯處理冪等,保證不管消費(fèi)多少次都與消費(fèi)一次的結(jié)果相同。
  • 使用死信隊(duì)列,當(dāng)消息一直重復(fù)消費(fèi)時(shí)加入死信隊(duì)列。
  • 監(jiān)控,發(fā)現(xiàn)異常消息消費(fèi)及時(shí)告警。

總結(jié)

消息重復(fù)產(chǎn)生的原因可以概括為兩點(diǎn),應(yīng)答失敗與業(yè)務(wù)異常循環(huán)消費(fèi)單條消息。

對(duì)于消息的重復(fù)消費(fèi),業(yè)界用的最多的,還是消息唯一標(biāo)識(shí)加冪等。消費(fèi)端代碼盡可能的對(duì)異常情況做好處理,保證在發(fā)生異常之后可以正確的應(yīng)答。

對(duì)于消息唯一標(biāo)識(shí)這里簡單說兩句,可以生產(chǎn)者加入消息唯一標(biāo)識(shí),消費(fèi)者也加入唯一標(biāo)識(shí),生產(chǎn)者與消費(fèi)者不必相同,保證消息唯一即可。

在消費(fèi)者進(jìn)行消費(fèi)消息時(shí),首先根據(jù)消息唯一標(biāo)識(shí)判斷是否已經(jīng)消費(fèi)過,可以使用 Redis 或者 MySQL 中的唯一索引等方式,然后來判斷該消息是否可以被消費(fèi)。

責(zé)任編輯:趙寧寧 來源: 醉魚Java
相關(guān)推薦

2024-06-06 11:38:55

2024-06-06 11:57:44

2020-08-17 07:40:19

消息隊(duì)列

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)

2021-08-09 07:47:40

Git面試版本

2020-12-01 08:47:36

Java異常開發(fā)

2020-06-12 15:50:56

options前端服務(wù)器

2019-05-10 10:50:04

Spring AOPJDK動(dòng)態(tài)代理CGLIB動(dòng)態(tài)代理

2021-09-16 07:52:18

算法應(yīng)用場景

2021-10-15 09:53:12

工具

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-26 10:57:16

集合操作場景

2021-09-07 08:33:27

JavaScript TypeScript 函數(shù)

2021-09-27 06:50:04

非線性數(shù)據(jù)

2021-11-09 08:51:13

模式命令面試

2020-12-04 06:27:04

序列化面試官Java

2021-11-05 07:47:56

代理模式對(duì)象

2021-06-30 07:19:36

React事件機(jī)制

2021-11-04 06:58:32

策略模式面試

2021-11-03 14:10:28

工廠模式場景
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)