【问题标题】:Kafka message partitioning by keyKafka消息按键分区
【发布时间】:2019-04-20 19:03:16
【问题描述】:

我们有一个业务流程/工作流,它在收到初始事件消息时启动,并在处理最后一条消息时关闭。我们每天执行多达 100,000 个流程。我的问题是到达特定进程的消息的顺序必须由接收到的相同顺序消息来处理。如果其中一条消息失败,则进程必须冻结,直到问题得到解决,尽管所有其他进程都必须继续。对于这种情况,我正在考虑使用 Kafka。我想到的第一个解决方案是通过消息键使用主题分区。消息的键是 ProcessId。这样我可以确定所有进程消息都会被分区,并且 kafka 会保证顺序。由于我是 Kafka 的新手,所以我设法弄清楚必须提前创建分区,这让一切变得困难。所以我的问题是:

1) 当我向不存在的 kafka 主题生成消息时,该主题是在运行时创建的。主题分区是否可以具有相同的行为? 2)主题上可以有超过 100,000 个活动分区,这是一个问题吗? 3)可以在读取该主题的所有消息后删除分区吗? 4) 也许你可以建议我的问题的其他方法?

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    当我向不存在的 kafka 主题生成消息时,该主题是在运行时创建的。主题分区是否可以具有相同的行为?

    创建主题时需要指定分区数。新分区不会自动创建(与创建主题一样),您必须使用topic 工具更改分区数。

    更多信息:https://kafka.apache.org/documentation/#basic_ops_modify_topi

    一旦您增加分区数量,生产者和消费者就会收到新分区的通知,从而导致他们重新平衡。重新平衡后,生产者和消费者将从新分区开始生产和消费。

    主题上可能有超过 100,000 个活动分区,这是个问题吗?

    是的,拥有这么多分区会增加整体延迟。 通过how-choose-number-topics-partitions-kafka-cluster 了解如何确定分区数。

    是否可以在读取该主题的所有消息后删除分区?

    删除分区会导致数据丢失,并且剩余数据的键也不会正确分配,因此新消息不会像具有相同键的旧现有消息那样被定向到相同的分区。这就是为什么 Kafka 不支持减少主题分区数的原因。

    另外,Kafka 文档指出

    Kafka does not currently support reducing the number of partitions for a topic.

    【讨论】:

      【解决方案2】:

      我想你选择了错误的功能来解决你的任务。

      • 通常,分区用于负载平衡。
      • 传入消息将根据在代理启动时定义的分区策略分布在给定数量的分区上。简而言之,默认策略只是计算i=key_hash mod number_of_partitions并将消息放入ith分区。有关策略的更多信息,您可以阅读here
      • 仅在分区内保证消息排序。使用来自不同分区的两条消息,你 have no guarantees 首先到达消费者。

      您可能会改用group。我是option for consumer

      • 每个组独立使用来自主题的所有消息。
      • 如果需要,组可以由一个或多个消费者组成。
      • 您可以分配多个组并动态添加新组(实际上是使用新 groupId 添加新消费者)。
      • 由于您可以停止/暂停任何消费者,您可以手动停止与指定组相关的所有消费者。我想没有单一的命令可以做到这一点,但我不确定。无论如何,如果您在每个组中都有一个消费者,您可以轻松阻止它。
      • 如果您想删除组,您只需关闭并退出相关的消费者。无需在代理端执行任何操作。

      作为一个缺点,您将获得 100,000 个阅读(单个)主题的消费者。至少网络负载很重。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 2019-04-24
        • 2016-04-18
        • 2017-04-29
        相关资源
        最近更新 更多