微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当生产者数量多于分区时,Kafka 默认分区器行为

如何解决当生产者数量多于分区时,Kafka 默认分区器行为

来自kafka faq page

在Kafka生产者中,可以指定一个分区键来指示消息的目标分区。认情况下,使用基于散列的分区器来确定给定键的分区 id

所以具有特定键的所有消息将始终转到主题中的同一分区:

  1. 消费者如何知道生产者写入了哪个分区,以便直接从该分区消费?
  2. 如果生产者多于分区,并且多个生产者正在写入同一个分区,那么偏移量是如何排序的,以便消费者可以消费来自特定生产者的消息?

解决方法

消费者如何知道生产者写到哪个分区

不需要,或者至少不应该,因为这会在客户端之间造成紧密耦合。所有消费者实例都应该负责处理订阅主题的所有消息。虽然您可以 assign 消费者到 TopicPartition 实例列表,并且您可以为给定的键调用 DefaultPartitioner 的方法来找出它会去哪个分区,但我个人没有遇到过需求为了那个原因。另外请记住,生产者可以完全控制 partitioner.class 设置,并且不需要将此设置告知消费者。

如果生产者多于分区,并且多个生产者正在写入同一个分区,那么偏移量是如何排序的...

生产者或分区的数量无关紧要。批次按顺序写入分区。您可以使用 max.in.flight.requests 限制每个 Producer 客户端一次发送的批次数量(并且每个应用程序只需要一个实例),但对于单独的应用程序,您当然无法控制任何顺序

这样消费者就可以消费来自特定生产者的消息?

再说一次,不应该这样做。

,

Kafka 是分布式事件流,它的一个用例是从生产者到消费者的服务解耦,生产者生产/一个应用程序消息到主题和消费者/另一个应用程序从主题中读取,

如果您有多个生产者,则数据在 kafka/topic/partition 中的顺序在生产者之间无法保证,它将是写入主题的消息的顺序,(即使有一个生产者)排序可能有问题,阅读幂等生产者)

偏移量是原子操作,它保证不会有两条消息获得相同的偏移量。

偏移量是运行号,它只在特定主题和特定分区中有意义

如果使用默认分区器,则意味着您正在使用 murmur2 算法来决定将消息发送到哪个分区,同时将包含键的记录发送到 kafka,生产者中的分区器运行散列函数,该函数返回一个值,该值是此密钥将发送到的分区的编号,这是相同的 murmur2 函数,因此对于相同的密钥,对于不同的生产者,您将不断获得相同的分区值

消费者被分配/订阅来处理主题/分区,它不知道哪个键被发送到每个分区,在消费者组中有分配器功能决定哪个消费者将处理哪个分区

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。