【问题标题】:are data split across partitions?数据是否跨分区拆分?
【发布时间】:2020-04-08 02:33:59
【问题描述】:

我阅读了一份 kafka 文档,但当有人谈论数据和分区时,我仍然感到困惑。 在文档中,我看到客户端会将消息发送到分区。 然后将复制消息分区到副本(跨代理)。 消费者从分区中读取数据。

我有一个有 2 个分区的主题。 假设我有一个生产者,它将消息发送到分区#1。 但我有 2 个消费者,一个从 partition#1 读取,第二个从 partition#2 读取。 这是否意味着我的分区#1 将有 50% 的消息,而分区#2 将有 50%。或者当客户端将数据发送到分区#1 时,分区#1 不仅应该是跨代理复制数据,而且应该是跨分区复制数据?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    关于你的具体例子...

    如果您的生产者在消息上没有密钥的情况下发送消息,则默认分区器(在生产者本身中)将应用循环算法将消息发送到分区,因此:消息 1 到分区 1,消息 2 到分区 2,消息3到分区1等等。这意味着你是对的,分区 1 将获得 50% 的消息。因此,从分区 1 读取的一个消费者将获得 50% 的已发送消息;其他 50% 将由从分区 2 读取的其他消​​费者获得。这就是 Kafka 的工作原理,以提高吞吐量并处理更多消费者。 重要的是要补充一点,当一个分区有更多副本时,其中一个被定义为“领导者”,另一个被定义为“跟随者”。消息交换总是通过“领导者”进行。 “追随者”只是副本。它们用于托管“领导者”分区的代理出现故障并且托管“跟随者”分区的另一个代理被选为“领导者”的情况。

    我希望这会有所帮助。

    【讨论】:

    • 消费者并不总是从领导者那里得到 - KIP-392
    • 这是最新的 2.3 中相当新的内容,不会改变我回答的性质。
    • 准确来说2.3只是在client端实现协议,broker端还没有发布,应该是2.4
    • 那么,就是说,partition count = consumer count,否则我们无法处理所有的消息,对吧?
    • 表示当消费者属于同一个消费者组时,partition count = Max(consumer count)。在您的示例中,您不能有 3 个消费者,因为其中一个将处于空闲状态,但您可以只有一个,例如,它将从两个分区获取消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多