Kafka消息按键分区

问题描述 投票:1回答:2

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

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

apache-kafka kafka-producer-api
2个回答
1
投票

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

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

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

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

关于这个主题可以有超过100,000个活动分区,这是一个问题吗?

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

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

删除分区会导致数据丢失,并且剩余数据的密钥也不会正确分发,因此新消息不会被引导到与具有相同密钥的旧现有消息相同的分区。这就是Kafka不支持减少主题分区数的原因。

此外,卡夫卡医生说

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


0
投票

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

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

可能你会使用组代替。这是option for consumer

  • 每个组独立地使用来自主题的所有消息。
  • 如果您需要,集团可以由一个或多个消费者组成。
  • 您可以动态分配多个组并添加新组(实际上,使用新的groupId添加新的使用者)。
  • 由于您可以停止/暂停任何使用者,您可以手动停止与指定组相关的所有使用者。我想没有一个命令可以做到,但我不确定。无论如何,如果你在每个组中都有单个消费者,你可以轻松地阻止它。
  • 如果要删除该组,则只需关闭并删除相关的使用者。不需要在经纪人方面采取任何行动。

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

© www.soinside.com 2019 - 2024. All rights reserved.