日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
生產(chǎn)環(huán)境一個(gè)問題讓我直接“懵”了

這是為什么呢?兩者之間相差了差不多10個(gè)多小時(shí),是不是這條消息重復(fù)消費(fèi)了16次,但從日志中并沒有打印出16次消息題,只打印了兩條消息,從日志角度來看應(yīng)該不是重復(fù)消費(fèi)了16次。

本著不輕易相信日志的原則,我覺得應(yīng)該去RocketMQ服務(wù)器上看看這條消息存儲(chǔ)的重試次數(shù),從而推斷出消息是否消費(fèi)失敗而進(jìn)行消費(fèi)重試,正好項(xiàng)目組也提供了消息的Key,根據(jù)消息key、發(fā)送主題名稱去查找消息,只能查詢到一條消息:

說明發(fā)送端確實(shí)只發(fā)送了一條消息。

那個(gè)時(shí)候服務(wù)集群并沒有發(fā)現(xiàn)什么異常,消費(fèi)者沒有重啟、隊(duì)列也沒發(fā)生重平衡,不符合RocketMQ會(huì)重復(fù)推送消息給客戶端的場景,那基本就可以斷定是消息消費(fèi)失敗重啟引起的,但RocketMQ消息消費(fèi)重試重試延遲是采取間隔的,往往第一次重試只需10秒就會(huì)發(fā)生重試,不應(yīng)該是10個(gè)小時(shí)?

為此,我特意根據(jù)Key分別查找了主題SCHEDULE_TOPIC_XXXX與%RETRY%重試主題,發(fā)現(xiàn)這個(gè)key也只有一條消息,說明這還僅僅是第一次重試,如下圖:

但從這里可以看到消息寫入到SCHEDULE_TOPIC_XXXX的時(shí)間為2022-05-27 22:26:20,然后過了10s就通過調(diào)度機(jī)制進(jìn)入到重試主題,并開始被消費(fèi),故進(jìn)行了第一次重試。

擴(kuò)展機(jī)制知識(shí):RocketMQ并發(fā)消費(fèi)的消費(fèi)者,在客戶端消費(fèi)失敗后會(huì)向服務(wù)端發(fā)送ACK,根據(jù)重試次數(shù)進(jìn)入到SCHEDULE_TOPIC_XXXX主題不同的隊(duì)列中,每一個(gè)隊(duì)列代表的延遲時(shí)間不一樣,經(jīng)過一定延遲時(shí)間后再次調(diào)度到消費(fèi)組的重試主題,被消費(fèi)者再次消費(fèi),實(shí)現(xiàn)時(shí)間間隔的重試,提高重試成功率。

那為什么第一次消費(fèi)是12點(diǎn)51分,為什么這么久才進(jìn)入到Broker的SCHEDULE_TOPIC_XXXX呢?

這個(gè)就是問題的關(guān)鍵所在,這個(gè)細(xì)節(jié)我平時(shí)也沒關(guān)注,故接下來得分析這段代碼,代碼具體定義在ConsumeMessageConcurrentlyService的processConsumeResult方法中。

原來,如果客戶端消費(fèi)失敗后向Broker發(fā)生ACK失敗后,會(huì)加入到msgBack失敗隊(duì)列中,并重新提交到消費(fèi)者這邊消費(fèi),并且這條消息的位點(diǎn)不會(huì)提交,因?yàn)橛嘘P(guān)鍵代碼:

consumeRequest.getMsgs().removeAll(msgBackFailed);

long offset = consumeRequest.getProcessQueue().removeMessage(consumeRequest.getMsgs());
if (offset >= 0 && !consumeRequest.getProcessQueue().isDropped()) {
this.defaultMQPushConsumerImpl.getOffsetStore().updateOffset(consumeRequest.getMessageQueue(), offset, true);
}

RocketMQ消費(fèi)位點(diǎn)采取最小位點(diǎn)提交,只要消息存在于本地處理隊(duì)列,位點(diǎn)就不會(huì)提交,從而會(huì)觸發(fā)消息積壓。但尷尬的是這個(gè)主題平時(shí)消息量很少,并沒有通過積壓來發(fā)現(xiàn)該問題。

根據(jù)現(xiàn)象與代碼結(jié)合,原因是客戶端一直消費(fèi)失敗,但向Broker提交ACK一直失敗,直到晚上22:26分才發(fā)送成功,從而才觸發(fā)重新消費(fèi)。

那現(xiàn)在的關(guān)鍵是為什么會(huì)發(fā)生ACK會(huì)失敗呢?這次比較遺憾,因?yàn)轫?xiàng)目組使用的是容器,這塊代碼并沒有采集到日志集群,導(dǎo)致無法查看錯(cuò)誤日志,而且所在的集群是正常的,這個(gè)疑問后續(xù)等我分析完畢后,再和大家來分享。


網(wǎng)站題目:生產(chǎn)環(huán)境一個(gè)問題讓我直接“懵”了
網(wǎng)站路徑:http://www.5511xx.com/article/cojddoo.html