0

kafka 常见问题页面

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

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

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

2 回答 2

1

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

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

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

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

以便消费者可以消费来自特定生产者的消息?

同样,不应该这样做。

于 2021-07-28T17:41:33.860 回答
0

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

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

偏移量是原子动作,它将保证没有两条消息将获得相同的偏移量。

偏移量为流水号,仅在特定主题和特定分区中有意义

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

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

于 2021-07-28T17:52:02.627 回答