【问题标题】:In Kafka is each message replicated across all partitions of a topic?在 Kafka 中,每条消息是否在主题的所有分区中复制?
【发布时间】:2017-11-30 22:28:43
【问题描述】:

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

【问题讨论】:

  • 为什么要投反对票????
  • 请查看这篇关于 Kafka 复制的小文章:meuslivros.github.io/kafka/ch04s04.html。我只是赞成这个问题。无缘无故投反对票的人并不酷。
  • 实际上复制不是跨分区完成的,而是跨多代理 kafka 集群的节点完成的。
  • 我没有对此投票,但否决票的正当理由可能是(根据 SO 指南):“这个问题没有显示任何研究工作”。我同意这一点,并且不赞成这样的问题。

标签: apache-kafka


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    分区和复制是两个不同的东西。

    分区是为了可扩展性。一个主题被划分在一个或多个分区中,分布在不同的代理上,以便更多的消费者可以连接到这些代理,以便接收发送到同一主题但来自不同分区的消息。增加分区增加了可扩展性和让更多消费者从同一主题获取消息的可能性。回答您的问题,发送到主题的每条消息仅进入(主题本身的)一个分区。

    复制是为了容错。您可以在创建主题时指定复制因子,这意味着该主题的每个分区在不同的代理上复制更多次。一个副本是生产者发送消息和消费者获取消息的“领导者”;其他副本是“跟随者”,它们具有来自“领导者”副本的消息副本。如果处理“领导者”副本的代理出现故障,则“跟随者”之一成为领导者。

    【讨论】:

    • 感谢您的详细回答。那么,这是否意味着如果你将一个主题分成 2 个分区,你将无法保证它们被消费的顺序?
    • Kafka 保证消息仅按分区而不是按主题排序。这意味着如果您需要某些消息的特定顺序,您必须为消息分配一个键,以便生产者将具有相同键的消息发送到同一个分区并且您有您需要的顺序。如果您不使用密钥,则它的工作方式是循环,您将失去排序。
    • 好的,但是如果你想横向扩展你的消费者,比如 5 个消费者,怎么样。它们都需要订阅同一个主题,并且主题的负载需要分散在它们之间。如果我们使用分区,那么我们如何处理“广播”情况,我们希望完全相同的消息发送给每个消费者......我们需要将它放在每个分区上吗?单个生产者可以将相同的消息写入所有分区吗?
    • 它使用消费者组工作。当消费者属于同一个消费者组时,他们每个人都会从主题的一个或多个分区中读取。请记住,每个分区只能从一个消费者那里读取。例如,有 4 个分区的主题,你有 2 个消费者,每个消费者将从 2 个分区读取消息;如果您最多有 4 个消费者,每个消费者将获得 1 个分区;如果你去 5 个消费者,最后一个将是空闲的,因为没有可用的分区。如果您在不同的消费者组中有消费者,他们将收到与“广播”相同的消息。
    • 例如,1 个主题 A 有 2 个分区 0 和 1。然后是两个消费者组 A 和 B。如果 A 有一个消费者,它正在从主题两个分区 0 和 1 中读取。如果 B 有一个消费者,它是从主题中读取并在相同的分区 0 和 1 上再次读取,因此得到相同的消息。当消费者属于同一个消费者组时,他们会跨不同的分区获取消息。
    猜你喜欢
    • 2021-12-30
    • 2021-03-27
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2016-10-15
    • 2020-05-17
    相关资源
    最近更新 更多