Apache kafka 如何配置kafka consumer,以便在自动缩放期间和之后获取的邮件总数保持不变?

Apache kafka 如何配置kafka consumer,以便在自动缩放期间和之后获取的邮件总数保持不变?,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,假设我有一个正在运行的消费者,它从10个分区获取数据。在一个轮询请求中,使用者每个分区获取10条记录,总共100条记录 现在,在向组中添加一个使用者并重新平衡后,两个使用者都从5个分区中获取数据,每个使用者现在总共获取50条记录(每个分区10条) 我想知道是否有一种方法可以配置Kafka Consumer,这样即使再添加一个Consumer,两个Consumer也会开始在每个分区中获取20条记录,这样总数仍然是100条 我尝试使用max.poll.records和fetch.max.bytes,

假设我有一个正在运行的消费者,它从10个分区获取数据。在一个轮询请求中,使用者每个分区获取10条记录,总共100条记录

现在,在向组中添加一个使用者并重新平衡后,两个使用者都从5个分区中获取数据,每个使用者现在总共获取50条记录(每个分区10条)

我想知道是否有一种方法可以配置Kafka Consumer,这样即使再添加一个Consumer,两个Consumer也会开始在每个分区中获取20条记录,这样总数仍然是100条

我尝试使用max.poll.records和fetch.max.bytes,但对我无效。 将fetch.max.bytes设置为1000后,kafka从分区中获取了25条记录。
在将max.poll.records设置为50之后,每个分区在轮询期间有25条max记录,因此10个分区有250条记录。我想把记录总数保持在50。如何才能做到这一点?

您无法设置直接配置来告诉KafkaConsumer它应该获取多少消息

我相信还有其他解决方案,但我看到以下两种选择:

  • 如果您了解消息大小,并且消息的字节大小大致相同,请将
    fetch.min.bytes
    fetch.max.wait.ms
    一起使用,以获取所需的最小消息。调整
    max.poll.records
    您可以尝试获得所需的准确数字
  • 使用KafkaConsumer的
    seek
    ,告诉消费者在下一次
    poll
    中,每个分区的偏移位置应该精确到哪个位置。的JavaDocs中描述了
    seek
    API“覆盖消费者将在下一次轮询(超时)时使用的获取偏移量。如果此API对同一分区多次调用,则将在下一次轮询()时使用最新的偏移量注意,如果该API在消费中途任意使用,则可能丢失数据,以重置获取偏移量“.< /LI>”。
您无法设置直接配置来告诉卡夫卡消费者它应该获取多少消息

我相信还有其他解决方案,但我看到以下两种选择:

  • 如果您了解消息大小,并且消息的字节大小大致相同,请将
    fetch.min.bytes
    fetch.max.wait.ms
    一起使用,以获取所需的最小消息。调整
    max.poll.records
    您可以尝试获得所需的准确数字
  • 使用KafkaConsumer的
    seek
    ,告诉消费者在下一次
    poll
    中,每个分区的偏移位置应该精确到哪个位置。的JavaDocs中描述了
    seek
    API“覆盖消费者将在下一次轮询(超时)时使用的获取偏移量。如果此API对同一分区多次调用,则将在下一次轮询()时使用最新的偏移量注意,如果该API在消费中途任意使用,则可能丢失数据,以重置获取偏移量“.< /LI>”。
谢谢你,迈克。但是,即使我在扩展分区后使用seek在一个使用者中获取消息,那么消息的总数也会减少,对吗?因为seek参数是相同的。我认为第一种方法也有同样的警告。seek方法可以用于主题分区。因此,您需要关闭两个使用者,实现新的逻辑,然后再次启动它们。目前,我看不到一条“容易”的道路来实现你想要做的事情。你是对的,这两种选择都不是直截了当的,并提出了一些警告。至少,我不知道有什么简单的选择…谢谢迈克。但是,即使我在扩展分区后使用seek在一个使用者中获取消息,那么消息的总数也会减少,对吗?因为seek参数是相同的。我认为第一种方法也有同样的警告。seek方法可以用于主题分区。因此,您需要关闭两个使用者,实现新的逻辑,然后再次启动它们。目前,我看不到一条“容易”的道路来实现你想要做的事情。你是对的,这两种选择都不是直截了当的,并提出了一些警告。至少,我不知道有什么简单的选择。。。