分区数量超过消费者时的 Apache Kafka 消息消费

Posted

技术标签:

【中文标题】分区数量超过消费者时的 Apache Kafka 消息消费【英文标题】:Apache Kafka message consumption when partitions outnumber consumers 【发布时间】:2014-02-13 03:51:27 【问题描述】:

如果我运行的 Kafka 集群的分区数多于我的唯一消费者组的消费者数。对消息的排序或跨分区的消息按时传递是否有任何保证?

简单示例: 2 个分区,1 个消费者 生产者通过一个键控制分区分配。 消息 1 进入并转到分区 A 消息 2 进来并转到分区 B 消息 3 进来并转到分区 A

我知道消息 1 将在消息 3 之前被使用,因为它们在同一个分区中。但是消息 2 呢?它会在消息 3 之前或之后被消耗吗?还是会有所不同?有没有可能在消息 1 之前被消费?

此外,如果分区 A 不断有新的 Messages 进来,并且生产比消费快怎么办?消息 2 会无限期地位于分区 B 中吗?什么时候消费?是否可以保证消息不会永远存在?

更一般地说: 如果消费者被分配到多个分区,该消费者如何以及何时在这些分区之间进行交换?

【问题讨论】:

您的问题的答案在很大程度上取决于您使用的消费者实现。 Kafka 对消费者如何从多个分区进行消费没有任何限制。例如,来自不同语言的不同消费者实现可能会有不同的行为。 【参考方案1】:

订购保证

Kafka 仅在分区内提供排序保证。在您的示例中,消息 2 可能在消息 1 之前、消息 1 之后或消息 3 之后被使用。这仅取决于使用者的性能。有关这方面的更多信息,请参阅文档:https://kafka.apache.org/documentation.html#introduction(“消费者”和“保证”主题)。

消费缓慢

Kafka 代理不知道消费者。它将消息存储在日志段中,直到相应的日志段被删除。消费者可以随时连接到代理并从最旧的日志段开始消费。最短消息保留时间由两个配置属性控制:log.retention.hourslog.retention.bytes(每个主题可能覆盖)。更多关于这方面的文档:https://kafka.apache.org/documentation.html#brokerconfigs。

回答您的问题:如果消费者最终比生产者慢,它有一些时间赶上(默认为 1 周)。如果没有,一些未使用的消息将被永久删除。

消费多个分区

高级消费者创建多个KafkaStream 对象,每个对象提供来自一个或多个分区的数据。如何使用这些流取决于您:在单独的线程中、循环等。还可以获取消息的时间戳并将流合并为单个流以恢复消息顺序。

【讨论】:

以上是关于分区数量超过消费者时的 Apache Kafka 消息消费的主要内容,如果未能解决你的问题,请参考以下文章

kafka消费组消费主题

Apache Kafka 是不是适合用作无序任务队列?

Apache Kafka:使用java方式操作消费组和重置分区偏移量(admin api)

kafka消费者组数量较大对性能有啥影响

KafKa消费者组重平衡能避免吗

Kafka生成消息时的3种分区策略