【发布时间】:2020-05-28 23:59:09
【问题描述】:
我有一个价值 1 GB 消息的主题。 A. Kafka 消费者决定消费这些消息。我能做些什么来禁止消费者一次消费所有消息?我试图设置
代理上的fetch.max.bytes
到 30 MB 以在每次轮询中只允许 30 MB 的消息。代理似乎不尊重这一点,并试图一次将所有消息提供给消费者,从而导致消费者内存不足错误。我该如何解决这个问题?
【问题讨论】:
标签: apache-kafka kafka-consumer-api
我有一个价值 1 GB 消息的主题。 A. Kafka 消费者决定消费这些消息。我能做些什么来禁止消费者一次消费所有消息?我试图设置
代理上的fetch.max.bytes
到 30 MB 以在每次轮询中只允许 30 MB 的消息。代理似乎不尊重这一点,并试图一次将所有消息提供给消费者,从而导致消费者内存不足错误。我该如何解决这个问题?
【问题讨论】:
标签: apache-kafka kafka-consumer-api
Kafka 配置可能会让人不知所措。通常在 Kafka 中,多个配置可以协同工作以达到一个结果。这带来了灵活性,但灵活性是有代价的。
来自fetch.max.bytes的文档:
记录是消费者分批抓取的,如果抓取的第一个非空分区的第一个记录批大于这个值,仍然会返回记录批,以保证消费者可以取得进展。
只有在消费者端,有更多的配置需要考虑来限制消费者的内存使用,包括:
max.poll.records:限制在一次轮询调用中检索到的记录数。默认值为 500。max.partition.fetch.bytes:限制每个分区获取的字节数。这应该不是问题,因为默认值为 1MB。根据KIP-81中的信息,实际使用的内存应该是min(num brokers * max.fetch.bytes, max.partition.fetch.bytes * num_partitions)。
另外,在同一个 KIP 中:
消费者(Fetcher)延迟解压,直到记录返回给用户,但由于 max.poll.records 的原因,它可能最终会保留来自单个分区的解压数据进行几次迭代。
我建议您也调整这些参数,希望这会让您进入所需的状态。
【讨论】:
max.partition.fetch.bytes 必须始终大于 max.message.bytes(代理配置)。否则,消费者可能无法消费所有消息。