分区数量超过消费者时的 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.hours
和log.retention.bytes
(每个主题可能覆盖)。更多关于这方面的文档:https://kafka.apache.org/documentation.html#brokerconfigs。
回答您的问题:如果消费者最终比生产者慢,它有一些时间赶上(默认为 1 周)。如果没有,一些未使用的消息将被永久删除。
消费多个分区
高级消费者创建多个KafkaStream
对象,每个对象提供来自一个或多个分区的数据。如何使用这些流取决于您:在单独的线程中、循环等。还可以获取消息的时间戳并将流合并为单个流以恢复消息顺序。
【讨论】:
以上是关于分区数量超过消费者时的 Apache Kafka 消息消费的主要内容,如果未能解决你的问题,请参考以下文章