首页 文章

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

提问于
浏览
15

如果我正在运行一个包含更多分区的Kafka群集,那么我的唯一消费者群体就有消费者 . 是否有对邮件订购或跨分区按时交付邮件的保证?

简单的例子:
2个分区,1个消费者
生产环境 者通过密钥控制分区分配 .
消息1进入并进入分区A.
消息2进入并进入分区B.
消息3进入并进入分区A.

我知道消息1将在消息3之前消耗,因为它们位于同一分区中 . 但消息2呢?它会在消息3之前或之后消耗吗?或者它会变化吗?可能在消息1之前消费吗?

如果新的消息继续进入分区A并且 生产环境 比消费更快怎么办?消息2会无限期地位于分区B中吗?什么时候会消耗?有没有保证消息不会永远存在?

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

1 回答

  • 19

    订购保证

    Kafka仅在分区内提供订购保证 . 在您的示例中,消息2可能在消息1之前,消息1之后或消息3之后消耗 . 这仅取决于使用者的性能 . 有关此内容的更多信息,请参见文档:https://kafka.apache.org/documentation.html#introduction('Consumers'和'Guarantees'主题) .

    消耗缓慢

    Kafka 经纪人并不了解消费者 . 它将消息存储在日志段中,直到相应的日志段被删除 . 消费者可以随时附加到经纪人并从最旧的日志段开始消费 . 最短消息保留时间由两个配置属性控制: log.retention.hourslog.retention.bytes (每个主题可能有覆盖) . 更多相关文档:https://kafka.apache.org/documentation.html#brokerconfigs .

    回答你的问题:如果消费者最终比 生产环境 者慢,那么它有一些时间赶上(默认为1周) . 如果没有,将永久删除一些未消费的消息 .

    消耗多个分区

    高级使用者创建多个 KafkaStream 对象,每个对象提供来自一个或多个分区的数据 . 它还可以获取消息的时间戳并将流合并为单个流恢复消息顺序 .

相关问题