如果我运行的Kafka群集中包含的分区多于我唯一的消费者群体的消费者群。是否有保证订购消息或跨分区按时交付消息的保证?
简单的例子:
2个分区,1个消费者
生产者通过密钥控制分区分配
消息1进入并进入分区A
消息2进入并进入分区B
消息3进入并进入分区A
我知道消息1将在消息3之前消耗,因为它们位于同一分区中。但是消息2呢?它会在消息3之前或之后消耗吗?或者它会变化吗?可能在消息1之前消费吗?
此外,如果新消息继续进入分区A并且生产比消费更快,该怎么办?消息2会无限期地位于分区B中吗?什么时候会消耗?有没有保证消息不会永远存在?
更一般地说: 如果将使用者分配给多个分区,该使用者如何以及何时在这些分区之间交换?
答案 0 :(得分:21)
Kafka仅在分区内提供订购保证。在您的示例中,消息2可能在消息1之前,消息1之后或消息3之后消耗。这仅取决于使用者的性能。有关此内容的更多信息,请参阅文档:https://kafka.apache.org/documentation.html#introduction('消费者'和'保证'主题)。
卡夫卡经纪人并不了解消费者。它将消息存储在日志段中,直到相应的日志段被删除。消费者可以随时附加到经纪人并从最旧的日志段开始消费。最短消息保留时间由两个配置属性控制:log.retention.hours
和log.retention.bytes
(每个主题可能有覆盖)。更多相关文档:https://kafka.apache.org/documentation.html#brokerconfigs。
回答你的问题:如果消费者最终比生产者慢,那么它有一些时间赶上(默认为1周)。如果没有,将永久删除一些未消费的消息。
高级使用者创建多个KafkaStream
个对象,每个对象提供来自一个或多个分区的数据。由您决定如何使用这些流:在单独的线程中,循环等等。还可以获取消息的时间戳并将流合并为单个流恢复消息顺序。