首页 > 解决方案 > Kafka fetch max bytes 无法按预期工作

问题描述

我有一个价值 1 GB 消息的主题。A. Kafka 消费者决定消费这些消息。我能做些什么来禁止消费者一次消费所有消息?我试图设置

fetch.max.bytes在经纪人上

到 30 MB 以在每次轮询中只允许 30 MB 的消息。代理似乎不尊重这一点,并试图一次将所有消息提供给消费者,从而导致消费者内存不足错误。我该如何解决这个问题?

标签: apache-kafkakafka-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,它可能最终会保留来自单个分区的解压数据进行几次迭代。

我建议您也调整这些参数,希望这会让您进入所需的状态。


推荐阅读