在Kafka中,是否在主题的所有分区中复制了每条消息?

Zur*_*iar 15 apache-kafka

如果主题有4个分区,并且发布者向主题发送消息,那么是否会在所有四个分区中复制相同的消息,还是只复制一个?

ppa*_*rno 15

分区和复制是两回事.

分区是为了可扩展性.主题在分布在不同代理上的一个或多个分区中进行分区,以便更多的消费者可以连接到这些代理,以便接收发送到同一主题但来自不同分区的消息.增加分区可以提高可伸缩性,并且可以让更多的消费者从同一主题获取消息.回答你的问题,发送给主题的每条消息只进入一个分区(主题本身).

复制是为了容错.您可以在主题创建时指定复制因子,这意味着该主题的每个分区都会在不同的代理上复制多次.一个副本是生产者发送和消费者获取消息的"领导者"; 其他副本是"追随者",其中包含来自"领导者"副本的消息副本.如果处理"领导者"副本的经纪人失败,其中一个"追随者"成为领导者.

  • 它使用消费者组工作。当消费者属于同一个消费者组时,他们每个人都会从主题的一个或多个分区中读取数据。请记住,每个分区只能从一个使用者读取。例如,主题有 4 个分区,您有 2 个消费者,每个消费者都会从 2 个分区读取消息;如果您最多有 4 个消费者,每个消费者将获得 1 个分区;如果你去 5 个消费者,最后一个将是空闲的,因为没有可用的分区。如果您在不同的消费者组中有消费者,他们将收到与“广播”相同的消息。 (4认同)
  • Kafka 保证消息仅按分区而不是按主题排序。这意味着如果您需要某些消息的特定顺序,则必须为消息分配一个键,以便生产者将具有相同键的消息发送到同一分区,并且您拥有所需的顺序。如果您不使用密钥,则它的工作方式是循环,并且您将失去排序。 (3认同)
  • 好的,但是如果你想横向扩展你的消费者,比如 5 个消费者。它们都需要订阅同一个主题,并且主题的负载需要分散在它们之间。如果我们使用分区,那么我们如何处理“广播”情况,即我们希望将完全相同的消息发送给每个消费者……我们是否需要将其放在每个分区上?单个生产者可以将相同的消息写入所有分区吗? (3认同)

vah*_*hid 7

不会跨分区进行复制。无论主题有多少个分区,每条消息都会进入主题的单个分区。

如果您将主题的复制因子设置为大于 1 的数字(假设您有多个代理在集群中运行),则主题的每个分区都将在这些代理之间复制。