一.背景介绍

项目上进行算法调度的需求,打算采用kafka作为消息中间件,通过将多个算法消费者加入到同一个group中并行的处理算法请求,从而达到高效处理的目的。但是算法处理的时间较长,多则几十分钟,短的几分钟。测试的结果是算法时间过长的消费者会引发kafka的rebalance,消费者无法再消费到新数据。

二.rebalance机制介绍

为了弄懂上述问题,还需要了解relance的机制。由于rebalance机制资料较多,在此只进行简单介绍。

Kafka保证同一groupId的consumer只会消费某条消息(即不重复消费也不漏数据),rebalance划分同一groupId的消费者与topic的分区的一一对应关系。因此每当有消费者加入或是退出时,必定会发生一次rebalance。在rebalance完成之前,消费者是拿不到任何数据的。

三.参数调整

简单了解rebalance后,再进行kafka的参数调整。此次调整涉及参数如下:

props.setProperty("enable.auto.commit", "false");

props.setProperty("auto.offset.reset", "earliest");

props.put("max.poll.records", "1");

props.put("max.poll.interval.ms",180000000);//5小时

props.put("heartbeat.interval.ms","2000");

参数说明:

1. "enable.auto.commit"设置为false后,消费后数据后需要手动调用consumer.commitAsync(),以保证将偏移量信息提交至kafka服务端。"enable.auto.commit"也可设置为true,便不必再手动调用consumer.commitAsync();
2.props.put ("session.timeout.ms",”1800000”),该条参数使用默认值即可,建议不要调整。测试时将该参数调大后,会引发groupId再次消费时无效的问题。
3."heartbeat.interval.ms"->"2000",测试时心跳时使用默认值或是调整2秒均可,理论值应该为"session.timeout.ms"的1/3,但是建议不要调整。
4. props.put("max.poll.records", "1"),每次poll拉取数据的最大条数。测试环境是一条kafka数据,对应一个算法任务,算法处理时间较长,因此测试时设置为1。
5. props.put("max.poll.interval.ms",180000000),该参数时间一定要设置大点,超过消费处理的最大时间开销。如果该参数较小,消费者处理时间超过该参数后,会引发两个现象。一个是偏移量提交会报错。一个是groupId会被移出消费组,再使用该groupId时无法正常

拿到数据。

四、调整后的问题。

按上述参数调整后,多个算法消费者均可以正常消费kafka数据了,但是碰到新的问题。

如果有2个算法消费者正在处理,一个算法需要3分钟,另一个算法需要20分钟。当加入一个新的算法消费者后会触发一次rebalance,触发rebalance完成后所有消费者还必须要等待那个处理20分钟的算法消费者调用consumer.poll()接口后,所有消费者才能正常接收数据。

Rebalance之后,会划分完消费者与分区对应关系,空闲的分区所对应的消费者理论上应该在rebalance之后可以直接消费数据。至于为什么非要等待所有消费者执行consumer.poll()接口后才能拿到数据,暂不知其中的原因。

五、总结

Kafka适用于吞吐量高,消费者处理能力高的场景,不太适用消费者处理能力低的场景。如果消费者处理能力低,可以使用其他的中间件,比如:rabbitmq。

  

kafka消费者处理能力低引起rebalance分析的更多相关文章

  1. Kafka消费者没有收到通知的分析

    今天遇到两位三方人员跟我反馈,某微服务的异步接口功能不正常了,由于该异步接口采用Kafka异步消息的方案,对方说没有收到Kafka给消费者的通知,根据此问题,联系了相关人员进行了分析: (一)明确环境 ...

  2. Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

  3. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

  4. Kafka 学习之路(四)—— Kafka消费者详解

    一.消费者和消费者群组 在Kafka中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka之所以要引入消费者群组这个概念是因为Kafka消费者经常会做一些 ...

  5. Kafka 系列(四)—— Kafka 消费者详解

    一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...

  6. 带你涨姿势的认识一下 Kafka 消费者

    之前我们介绍过了 Kafka 整体架构,Kafka 生产者,Kafka 生产的消息最终流向哪里呢?当然是需要消费了,要不只产生一系列数据没有任何作用啊,如果把 Kafka 比作餐厅的话,那么生产者就是 ...

  7. 5.Kafka消费者-从Kafka读取数据(转)

    http://www.dengshenyu.com/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/11/14/kafka-consumer.ht ...

  8. Kafka系列2:深入理解Kafka消费者

    Kafka系列2:深入理解Kafka消费者 上篇聊了Kafka概况,包含了Kafka的基本概念.设计原理,以及设计核心.本篇单独聊聊Kafka的消费者,包括如下内容: 生产者是如何生产消息 如何创建生 ...

  9. 入门大数据---Kafka消费者详解

    一.消费者和消费者群组 在 Kafka 中,消费者通常是消费者群组的一部分,多个消费者群组共同读取同一个主题时,彼此之间互不影响.Kafka 之所以要引入消费者群组这个概念是因为 Kafka 消费者经 ...

  10. 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的

    ☞☞☞ 我是如何将一个老系统的kafka消费者服务的性能提升近百倍的 ☜☜☜ ○○○○○○○○○○○○○○○ 大家好,又见面了~ kafka作为一种高吞吐量的分布式发布订阅消息系统,在业务系统中被广泛 ...

随机推荐

  1. manim边学边做--MathTex

    上一篇介绍的SingleStringMathTex主要用来显示只有一行的数学公式,对于复杂的数学公式,可以使用MathTex类. MathTex类继承自SingleStringMathTex,在其基础 ...

  2. Mac下Eclipse打不开了怎么办

    其实这个问题能搜到很多答案,但是对我有效的只有下面这一种. 背景 我需要使用到Eclipse,就下载了它的特定版本,用于开发RAP的. 连续两次都是使用后关闭,就再也打不开了. 选定的解决方案 试了好 ...

  3. AT_joisc2019_j 题解

    先考虑这个式子: \[\sum_{j=1}^{M} |C_{k_{j}} - C_{k_{j+1}}| \] 一定是在 \(C\) 有序时取到,具体证明很简单各位读者自己证明. 那么现在式子变成: \ ...

  4. Java中的泛型(类、接口、方法)

    一.泛型概述 1. 什么是泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数.在调用普 ...

  5. WOE编码与IV值

    参考: WOE与IV值浅谈 机器学习-变量筛选之IV值和WOE 0. Introduction WOE (weight of evidence): 证据权重 IV (information value ...

  6. Java 反射获取对象里的值

    最近在负责邮件服务,里面会涉及到很多Email模板,这里我使用到了java的模板引擎:jetbrick-template,需要使用Map集合一个个往里面设置值,然后调用模板方法,进行替换.实体类一个个 ...

  7. yb课堂之用户注册登陆模块《六》

    用户注册功能接口开发 注册接口开发 MD5加密工具类封装 UserMapper.xml <?xml version="1.0" encoding="UTF-8&qu ...

  8. WPF/C#:在WPF中如何实现依赖注入

    前言 本文通过 WPF Gallery 这个项目学习依赖注入的相关概念与如何在WPF中进行依赖注入. 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于 ...

  9. LeViT:Facebook提出推理优化的混合ViT主干网络 | ICCV 2021

    论文提出了用于快速图像分类推理的混合神经网络LeVIT,在不同的硬件平台上进行不同的效率衡量标准的测试.总体而言,LeViT在速度/准确性权衡方面明显优于现有的卷积神经网络和ViT,比如在80%的Im ...

  10. [oeasy]python0074_修改字体背景颜色_background_color_背景色

    修改背景色 回忆上次内容 上次将asciiart和颜色一起来玩 7 种基本色 变化多端 不过到目前为止 改的 都是前景色 背景色可以修改吗? 重温参数 具体动手试试 print("\033[ ...