【问题标题】:Kafka Partition ordering guaranteeKafka Partition 订购保证
【发布时间】:2019-04-28 15:24:56
【问题描述】:

我确实意识到在 Kafka 中可以确保按分区进行排序。但是当有多个分区并且生产者没有指定键,而只有1个消费者时,分区会受到怎样的影响(为什么有1个消费者?对于当前的数据加载1很好,有多个分区以备将来使用)

20 partitions
1 consumer
No key specified when producing.

1)会影响排序吗?

2)消费者是否会依次从分区0,1..20读取数据?

3) 即使我们指定了分区键,我们也可以保证我们会拥有 就地订购? (哈希冲突的情况除外)

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    如果没有在producer端定义key,kafka每次都会在每个partition中生成一条消息。循环生产数据 [code here].

    例如,如果您有 2 个分区:

    msg_1 -> partition: 0
    msg_2 -> partition: 1
    msg_3 -> partition: 0
    msg_4 -> partition: 1
    

    这样做的问题是你无法确保在另一边的排序,因为消费的消息可以在每个分区的不同时间消费。假设您有一条消息在分区 0 偏移 1 中,第二条消息在分区 1 偏移 1 中。Kafka 消费者可以在进入分区 0 之前从分区 1 开始消费消息。

    为避免此问题,您应该始终对需要订购的消息使用相同的密钥。现在解决这个问题的唯一方法是创建一个状态存储,并在每次需要阅读文档时检查它的状态。

    如果您设置密钥,您将始终将密钥发送到同一个分区,拥有不同顺序的唯一方法是在生产者端,但这将是一个竞争条件。只有当您有两个生产者同时生产相同的密钥时,才会出现订单中断的情况。你可以检查逻辑here

    【讨论】:

      猜你喜欢
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2018-02-18
      • 2016-03-11
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多