kafka消费者拉取数据不均匀

从此,记忆里唯有你。 发表于: 2019-10-22   最后更新时间: 2019-10-22  

kafka消费者poll数据,参数设置的为1000ms,max.poll.records=3000,基本每次都能拉取到2000多条消息,今天突然出现了一次拉取几十条几百条消息,这种情况正常吗???为什么会出现这种数据消息数不均匀的情况????



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: kafka安全认证报 java.io.IOException: Configuration Error: expected [;], read [end of file]
下一条: nginx代理转发kafka请求的问题

  • 拉取的消息数量,跟消息的大小也有关系,一个批次的消息总大小是固定的。
    可参考:https://www.orchome.com/535

    • 一次性拉取的批次大小,有几个因素决定。
      比如你有几个分区,消费者有几个,1个消费者绑定了几个分区。
      如果绑定了1个分区,那消费者持续拉取该分区的,如果你的消息大小不变,那这个就会比较平稳,如果1个消费者绑定多个分区,那它就会轮询获取这多个分区的消息(轮询需要耗时)。
      拉取消息有2个重要的因素,一个是时间,一个是批次的总量,比如100毫秒为时间,那么100毫秒内不管消息填满批次的总量,都将返回消息,或者100毫秒还没到,批次已经满了,则马上返回。

        • 三个分区 对应三个消费者 时间是1000ms 消息批次总大小为2m 一个分区一个消费者 基本情况都是拉取2000多条消息 说明消息总大小限制没问题,今天测试时出现了部分几百条还有几十条的情况 感觉很奇怪 难道是1000ms就拉取了这么点消息吗???? 感觉违背了常理

            • 你说的是这个参数吗??max.poll.interval.ms=300000
              这个poll(ms)设置的时间没有用的是什么意思 这个不是拉取消息的时间吗?
              测试时候消息一直都是积压状态的
              当前的参数配置是这样的

              max.poll.interval.ms=300000
              max.poll.records=3000
              max.partition.fetch.bytes=1048576
              poll(1000

              我是不是忽略了什么参数的设置呢? 才导致这种消息拉取不均匀的情况出现

                • poll(1000)这个是当kafka上没有消息的时候,多长时间去拉取一次。

                  上面那几个都是max的限制,你关注的配置都是每个分区的,而不是整体的,整体是指,你有3个分区,每个分区一次性拉40M,但是你的总限制是100M,自然就会有1个分区拉的少。
                  如:fetch.max.bytes

                    • 还有,一个消费者对应一个分区,这个分区的消息不会被其他的消费者消费到,跟分区对应,本身就是"均匀"的。

                      此外,消息是批量拉取的,是kafka服务于客户端程序之间的,为了减少单次传输频次而已,应用也不会一次性处理2000条消息(同一时间,并行和串行各自实现)

                        • 嗯嗯 确实有您说的这种情况,确实是我没考虑到的。
                          大佬帮忙分析一下有没有这种情况,max.partition.fetch.bytes限制的情况下,假如fetch到了5000个record,放到本地缓存后,由于max.poll.records限制每次只能poll出1500个record。那么KafkaConsumer就需要执行4次才能将这一次通过网络发起的fetch请求所fetch到的这5000个record消费完毕。其中前3次是每次pool中1500个record,最后一次是poll出500个record。