成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線上Kafka消息堆積,Consumer掉線,怎么辦?

開發 前端
服務端、客戶端都沒有特別的異常日志,kafka其他topic的生產和消費都是正常,所以基本可以判斷是客戶端消費存在問題。

線上kafka消息堆積,所有consumer全部掉線,到底怎么回事?

最近處理了一次線上故障,具體故障表現就是kafka某個topic消息堆積,這個topic的相關consumer全部掉線。

整體排查過程和事后的復盤都很有意思,并且結合本次故障,對kafka使用的最佳實踐有了更深刻的理解。

好了,一起來回顧下這次線上故障吧,最佳實踐總結放在最后,千萬不要錯過。

1、現象

線上kafka消息突然開始堆積

消費者應用反饋沒有收到消息(沒有處理消息的日志)

kafka的consumer group上看沒有消費者注冊

消費者應用和kafka集群最近一周內沒有代碼、配置相關變更

2、排查過程

服務端、客戶端都沒有特別的異常日志,kafka其他topic的生產和消費都是正常,所以基本可以判斷是客戶端消費存在問題。

所以我們重點放在客戶端排查上。

1)arthas在線修改日志等級,輸出debug

由于客戶端并沒有明顯異常日志,因此只能通過arthas修改應用日志等級,來尋找線索。

果然有比較重要的發現:

2022-10-25 17:36:17,774 DEBUG [org.apache.kafka.clients.consumer.internals.AbstractCoordinator] - [Consumer clientId=consumer-1, groupId=xxxx] Disabling heartbeat thread

2022-10-25 17:36:17,773 DEBUG [org.apache.kafka.clients.consumer.internals.AbstractCoordinator] - [Consumer clientId=consumer-1, groupId=xxxx] Sending LeaveGroup request to coordinator xxxxxx (id: 2147483644 rack: null)

看起來是kafka-client自己主動發送消息給kafka集群,進行自我驅逐了。因此consumer都掉線了。

2)arthas查看相關線程狀態變量用arthas vmtool命令進一步看下kafka-client相關線程的狀態。

圖片

可以看到 HeartbeatThread線程狀態是WAITING,Cordinator狀態是UNJOINED。

此時,結合源碼看,大概推斷是由于消費時間過長,導致客戶端自我驅逐了。

于是立刻嘗試修改max.poll.records,減少一批拉取的消息數量,同時增大max.poll.interval.ms參數,避免由于拉取間隔時間過長導致自我驅逐。

參數修改上線后,發現consumer確實不掉線了,但是消費一段時間后,還是就停止消費了。

3、最終原因

相關同學去查看了消費邏輯,發現了業務代碼中的死循環,確認了最終原因。

消息內容中的一個字段有新的值,觸發了消費者消費邏輯的死循環,導致后續消息無法消費。同時,消費阻塞導致消費者自我驅逐,partition重新reblance,所有消費者逐個自我驅逐。

這里核心涉及到kafka的消費者和kafka之間的?;顧C制,可以簡單了解一下。

圖片

kafka-client會有一個獨立線程HeartbeatThread跟kafka集群進行定時心跳,這個線程跟lisenter無關,完全獨立。

根據debug日志顯示的“Sending LeaveGroup request”信息,我們可以很容易定位到自我驅逐的邏輯。

圖片

HeartbeatThread線程在發送心跳前,會比較一下當前時間跟上次poll時間,一旦大于max.poll.interval.ms 參數,就會發起自我驅逐了。

4、進一步思考

雖然最后原因找到了,但是回顧下整個排查過程,其實并不順利,主要有兩點:

kafka-client對某個消息消費超時能否有明確異常?而不是只看到自我驅逐和rebalance

有沒有辦法通過什么手段發現 消費死循環?

4.1 kafka-client對某個消息消費超時能否有明確異常?

4.1.1 kafka似乎沒有類似機制

我們對消費邏輯進行斷點,可以很容易看到整個調用鏈路。

圖片

對消費者來說,主要采用一個線程池來處理每個kafkaListener,一個listener就是一個獨立線程。

這個線程會同步處理 poll消息,然后動態代理回調用戶自定義的消息消費邏輯,也就是我們在@KafkaListener中寫的業務。

圖片

所以,從這里可以知道兩件事情。

第一點,如果業務消費邏輯很慢或者卡住了,會影響poll。

第二點,這里沒有看到直接設置消費超時的參數,其實也不太好做。

因為這里做了超時中斷,那么poll也會被中斷,是在同一個線程中。所以要么poll和消費邏輯在兩個工作線程,要么中斷掉當前線程后,重新起一個線程poll。

所以從業務使用角度來說,可能的實現,還是自己設置業務超時。比較通用的實現,可以是在消費邏輯中,用線程池處理消費邏輯,同時用Future get阻塞超時中斷。

google了一下,發現kafka 0.8 曾經有consumer.timeout.ms這個參數,但是現在的版本沒有這個參數了,不知道是不是類似的作用。

4.1.2 RocketMQ有點相關機制

然后去看了下RocketMQ是否有相關實現,果然有發現。

在RocketMQ中,可以對consumer設置consumeTimeout,這個超時就跟我們的設想有一點像了。

consumer會啟動一個異步線程池對正在消費的消息做定時做 cleanExpiredMsg() 處理。

圖片

注意,如果消息類型是順序消費(orderly),這個機制就不生效。

如果是并發消費,那么就會進行超時判斷,如果超時了,就會將這條消息的信息通過sendMessageBack() 方法發回給broker進行重試。

圖片

如果消息重試超過一定次數,就會進入RocketMQ的死信隊列。

spring-kafka其實也有做類似的封裝,可以自定義一個死信topic,做異常處理

4.2 有辦法快速發現死循環嗎?

一般來說,死循環的線程會導致CPU飆高、OOM等現象,在本次故障中,并沒有相關異常表現,所以并沒有聯系到死循環的問題。

那通過這次故障后,對kafka相關機制有了更深刻了解,poll間隔超時很有可能就是消費阻塞甚至死循環導致。

所以,如果下次出現類似問題,消費者停止消費,但是kafkaListener線程還在,可以直接通過arthas的 thread id 命令查看對應線程的調用棧,看看是否有異常方法死循環調用。

5、最佳實踐

通過此次故障,我們也可以總結幾點kafka使用的最佳實踐:

  • 使用消息隊列進行消費時,一定需要多考慮異常情況,包括冪等、耗時處理(甚至死循環)的情況。
  • 盡量提高客戶端的消費速度,消費邏輯另起線程進行處理,并最好做超時控制。
  • 減少Group訂閱Topic的數量,一個Group訂閱的Topic最好不要超過5個,建議一個Group只訂閱一個Topic。
  • 參考以下說明調整參數值:max.poll.records:降低該參數值,建議遠遠小于<單個線程每秒消費的條數> * <消費線程的個數> * <max.poll.interval.ms>的積。max.poll.interval.ms: 該值要大于<max.poll.records> / (<單個線程每秒消費的條數> * <消費線程的個數>)的值。
責任編輯:武曉燕 來源: 阿丸筆記
相關推薦

2021-02-24 08:38:48

Kafka消息Consumer

2022-05-10 07:31:49

消息隊列CPUQPS

2024-03-20 08:33:00

Kafka線程安全Rebalance

2020-09-29 12:15:13

生死鎖MySQL

2024-12-12 14:56:48

消息積壓MQ分區

2022-06-24 09:22:15

MySQL自增id

2022-07-14 10:16:22

Flink

2022-07-14 10:23:39

數據

2023-12-21 08:01:41

RocketMQ消息堆積

2009-11-03 08:56:02

linux死機操作系統

2024-04-22 08:17:23

MySQL誤刪數據

2022-12-19 11:31:57

緩存失效數據庫

2017-02-21 13:11:43

SDN網絡體系SDN架構

2022-05-19 08:01:49

PostgreSQL數據庫

2019-10-12 09:50:46

Redis內存數據庫

2018-01-28 20:39:39

戴爾

2022-07-05 11:48:47

MySQL死鎖表鎖

2015-10-22 09:09:59

BAT投資VC

2021-11-08 15:38:15

消息延遲堆積

2017-12-21 20:01:38

潤乾報表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内成人免费视频 | 国产福利在线小视频 | 欧美一区二区视频 | 一级毛片黄片 | 欧美日韩国产在线观看 | 欧美精品一区二区三区在线播放 | 91在线视频免费观看 | 国产观看| 91在线视频 | 欧美一区二区三 | 久精品视频| 午夜在线视频 | 91操操操 | 成人一区二区三区在线观看 | 欧美一页| 一区二区三区欧美大片 | 欧美日本一区二区 | 一区二区三区欧美 | 久久久国产精品 | 久久精品国产v日韩v亚洲 | 亚洲精品区 | 黄色一级免费 | 欧美日韩在线观看一区 | 国产一级片精品 | 成人免费看片 | 国产分类视频 | 久久婷婷色 | 欧洲精品在线观看 | 91av精品| 日本a在线 | 亚洲天堂av一区 | 成人精品一区二区 | 国产精品美女久久久久久不卡 | 黄网站免费在线观看 | 国产天天操 | 色综合天天综合网国产成人网 | 在线观看视频91 | 亚洲色图网址 | 天天色av| 国产成人福利视频 | 国产一区不卡 |