问题描述

项目在生产上的一段错误日志如下,

[commitSync] processed message to kafka failed, Just Ignore this commit, wait for next commit to make these messages processed.org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time message processing. You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:786)

这是一段kafka的错误日志,大概的意思是说,

kafka的服务端在超过了 max.poll.interval.ms 时间内没有收到某个消费者的心跳,认为该消费者已经“挂了”,所以进行了topic的分区所有权“再均衡”。

问题的分析

按照我的个人习惯,遇到类似这样的生产问题,解决之后我会思考下涉及的技术细节并做整理。

如果对问题涉及的技术细节非常的了解,对于定位问题是非常有帮助的。本文就带你深入了解下上面那个错误日志涉及的一些技术细节。

kafka的topic分区

为了提高消息处理的高可用以及便于横向扩展,kafka引入了topic的分区概念。属于同一个消费者群组的消费者可以分担的消费同一个topic不同分区的消息。从而达到分流的作用,可以使消息处理更高效。

如上图示例所示,topic A有三个分区,同时我们有三个属于同一个群组的消费者,这样每个消费者可以负责消费一个分区。大家各自负责自己的分区,系统有条不紊的运行着。

一般情况下,我们通过增加群组里的消费者数量来提高 kafka 的消费能力。不过要注意,不要让消费者的数量超过主题分区的数量,多余的消费者只会被闲置。

心跳机制

kafka 的服务端需要一直监控有哪些消费者在消费,监控的机制是通过消费者不断的发送心跳包实现的。消费者发送心跳有两个途径,一个是轮询(poll,注意联系上面的错误日志),一个是消费后提交 offset 。

这两种方式是两个独立的线程,互相不干扰。

只要消费者以正常的时间间隔发送心跳,就被认为是活跃的,说明它还在读取分区里的消息,否则就被认为是已经“死亡”。
这个所谓的正常的时间间隔,就是不能超过 max.poll.interval.ms。

kafka的分区再均衡

消费者通过向服务端发送心跳来维持它们和群组的从属关系以及它们对分区的所有权关系。如果服务端认为某个消费者已经“死亡”,就会触发一次再均衡。如下图所示,

前面说过,群组里的消费者共同读取主题的分区。

比如有一个新的消费者加入群组,它读取的是原本由其他消费者读取的消息。当一个消费者被关闭或发生崩溃时,它就离开群组,原本由它读取的分区将由群组里的其他消费者来读取。

分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。

再均衡有什么意义吗?

当然,有了再均衡,我们可以放心的添加或者移除某个消费者,而不用担心消息的丢失。

解决问题

了解了相关的技术细节后,我们可以顺藤摸瓜,慢慢排查问题。基于前面的分析,我给出几个排查的方向:

  1. 看看某个消费者的服务是否已经挂了?
  2. 如果服务正常运行,服务所在的节点是否有频繁FULL GC的情况,或者存在内存或者CPU占满的情况,导致消费者无法及时的发送心跳等。我遇到的情况就是这个原因引起的。后来解决了full GC的问题后,kafka的错误就不存在了。
    无法及时的发送心跳等。我遇到的情况就是这个原因引起的。后来解决了full GC的问题后,kafka的错误就不存在了。
  3. 根据自己实际的业务情况,考虑增加 max.poll.interval.ms 的值。

消息队列之Kafka 再平衡问题(七)相关推荐

  1. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 消息队列和Kafka的基本介绍 一.什么是消息队列 二.消息队列的应用场景 ...

  2. Cris 玩转大数据系列之消息队列神器 Kafka

    Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 文章目录 Cris 玩转大数据系列之消息队列神器 Kafka Author:Cris 1. Kafka 概述 1.1 消息队 ...

  3. 消息队列之Kafka

    背景:Dubbo远程调用的性能问题 Dubbo调用普遍存在于我们的微服务项目中, 这些Dubbo调用全部是同步的操作, 这里的"同步"指:消费者A调用生产者B之后,A的线程会进入阻 ...

  4. “简单”的消息队列与kafka

    小时候就特别喜欢龙系精灵,特别是乘龙,后来才知道只是冰水...尴尬. 在宠物小精灵中,乘龙一直是训练家的载人伙伴,和我们下面的MQ好像有几分相似呢~~ 前言 MQ,全称消息队列,现在市面上有很多种消息 ...

  5. python消息队列celery_消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?...

    写这篇博文的起因是,我在论坛宣传我开源的新项目YTask(go语言异步任务队列)时,有小伙伴在下面回了一句"为什么不用nsq?".这使我想起,我在和同事介绍celery时同事说了一 ...

  6. 【消息队列】kafka是如何保证消息不被重复消费的

    一.kafka自带的消费机制 kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offs ...

  7. 扫盲消息队列 | 消息中间件 | Kafka

    先吐槽 我真的写技术文章写到怀疑人生,我翻看历史发文记录,只要我一本正经的写的技术文章,都没人看,但是!一发闲扯淡的内容,阅读量肯定是技术文的好几倍(读者爸爸们别这么搞嘛) 这说明啥?说明学习还是太枯 ...

  8. 消息队列_消息队列:kafka

    概念 kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域. 要理解kafka首先要有分布式的概念,要有消息队列的概念.分布式系统最大的优势就是解耦和削峰,这种情况下,A系 ...

  9. 消息队列之kafka面试题

    1.什么是kafka Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要 ...

最新文章

  1. [Linux学习]虚拟机系统与实际系统共享文件的方式
  2. 【编程通识】正则表达式
  3. 理解单片机系统—汇编语言
  4. [Usaco2007 Demo][BZOJ1628] City skyline
  5. 快手公司厕所装坑位计时器,网友:再也不能带薪拉屎了!
  6. UI素材模板|优秀的后台管理系统UI面板
  7. 开源的数据可视化JavaScript图表库:ECharts
  8. 堪称神级的Spring Boot手册,从基础入门到实战进阶
  9. elasticsearch 7.0.1 + kibana + elasticsearch-analysis-ik 7.0.0 安装和配置过程中问题备忘录...
  10. 谷歌翻译API, 免费采集翻译
  11. 编写自己的newman reporter
  12. QPalette类详细使用方法
  13. unittest框架中使用parameterized模块参数化
  14. 数据库事务 ACID
  15. nginx禁止某些指定的浏览器标识来爬我们网站
  16. k-means算法简介
  17. 魅力电子学习考试小笔记
  18. 【记第一次kaggle比赛】PetFinder.my - Pawpularity Contest 宠物预测
  19. 教你使用日文输入法-日文输入显示不用愁
  20. leetcode-算法基础-5、6、7、8

热门文章

  1. 前程无忧达成私有化协议:遭遇大砍价 作价降至43亿美元
  2. 五种常见的加密方式及常用的加解密工具
  3. 【Aegisub相关】math.random 行为记录
  4. app常见性能测试点
  5. up主迎来春天,开始叫马云爸爸啦,阿里巴巴通过淘宝收购B站2400万股
  6. 第四章 实验一 用类描述坦克
  7. 家装灯线走线图_求一套完整家庭装修电路图和走线图用来学习
  8. hihocoder 闰秒
  9. python中没有及|| 取而代之的是 and和or
  10. hurd和linux内核区别,GNU Guix “放弃” Linux 内核 Hurd 内核“取而代之”