当前位置: 首页 > 知识库问答 >
问题:

当生产者数量超过分区数时,Kafka默认的分区器行为

周承天
2023-03-14

来自Kafka常见问题页面

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

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

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

共有2个答案

习淇
2023-03-14

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

如果您有多个生产者,生产者之间不能保证数据在Kafka/主题/分区中的顺序,而是写入主题的消息的顺序(即使只有一个生产者,也可能存在排序问题,请阅读关于幂等生产者的文章)

偏移量是原子操作,它将promise没有两条消息会得到相同的偏移量。

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

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

使用者被分配/订阅来处理主题/分区,它不知道哪个密钥被发送到每个分区,在使用者组中有一个赋值函数来决定哪个使用者将处理哪个分区

柴阳云
2023-03-14

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

不需要,或者至少不应该,因为这将在客户端之间创建紧密耦合。所有使用者实例都应负责处理订阅主题的所有消息。虽然您可以将消费者分配给TopicPartition实例列表,并且您可以为给定的键调用DefaultPartitioner的方法来找出它将转到哪个分区,但我个人并不需要这样做。另外,请记住,生产者可以完全控制分区器。类设置,并且不需要将此设置告知消费者。

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

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

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

同样,不应这样做。

 类似资料:
  • 如果我运行的Kafka集群的分区比我的单个消费者组拥有的消费者还多。对消息的排序或跨分区的消息的按时传递是否有任何保证? 简单示例: 2个分区,1个使用者 生产者通过一个密钥控制分区分配。 消息1进入并转到分区a 消息2进入并转到分区B 消息3进入并转到分区a 我知道消息1将在消息3之前被使用,因为它们在同一个分区中。但是第二条信息呢?是在消息3之前消费还是在消息3之后消费?还是会有变化?它可能在

  • 我正在创建一个系统,其中前端服务将消息推送到Kafka请求主题,并为一些下游后端消费者(实际上是一个最终推送回Kafka的复杂系统)监听另一个响应主题,以处理请求消息并最终推进到“回应”话题。 我试图找出最优雅的方法来确保消费者监听适当的分区并收到响应,并且后端推送到前端消费者正在监听的分区。我们总是需要确保响应到达产生初始消息的同一个消费者。 到目前为止,我有两种解决方案,但都不是特别令人满意的

  • 我的理解是,Kafka制作人向Kafka经纪人群发送消息。我的问题是,Kafka制作人在网络分割期间的行为是什么?如果分区太长(并且卷太高),最终消息会丢失吗? 此外,如果系统在分区期间崩溃,Kafka队列中的所有消息都会丢失吗?

  • 我正在测试在一个正在运行的系统中添加Kafka分区,但我不清楚如果您将分区添加到一个现有的主题中,Kafka如何管理现有的数据。 例如: 我有一个主题为的Kafka实例,有一个分区和一个副本。 生产者组开始插入该主题,消费者组开始消费。 我更改主题以添加另一个分区。 在本例中,主题数据发生了什么?是在两个分区之间重新平衡,还是只有新生成的数据才会使用新分区?

  • 我们从每个kafka机器的中得到了许多错误(集群中有kafka) 根据我的理解,每个主题都由一个或多个经纪人服务--一个是领导者,其余的经纪人是追随者。

  • 我有一个关于RDD中默认分区的问题。 我不知道为什么会这样。你能帮忙吗。 谢了!