kafka消费者拉取数据不均匀

从此,记忆里唯有你。 发表于: 2019-10-22   最后更新时间: 2019-10-22 20:26:58   4,662 游览

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

发表于 2019-10-22
添加评论

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

嗯嗯 是这样 我这边每个消息大小是固定的 但就是有时候拉取的消息数量量特别少 一般时候2000多 偶尔几百

大佬 你好 现在的情况是不同批次的消息,总大小差距较大,目前不知道是什么情况???

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

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

这个poll(ms)设置的时间没有用的,当你有持续的消息进来的时候,是持续的去拉取消息。
而当消息没有的时候,多长时间去向kafka询问拉取。

你说的是这个参数吗??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。

嗯,配置有优先顺序,当消费者注册到kafka的时候,就会把max.poll.records等信息告知kafka,kafka会的策略会根据这些条件,哪个先达到了就立即返回。

你的答案

查看kafka相关的其他问题或提一个您自己的问题