Apache kafka Kafka消息按键分区

Apache kafka Kafka消息按键分区,apache-kafka,kafka-producer-api,Apache Kafka,Kafka Producer Api,我们有一个业务流程/工作流,在收到初始事件消息时启动,在处理最后一条消息时关闭。我们每天执行多达100000个流程。我的问题是,到达特定进程的消息的顺序必须与接收消息的顺序相同。如果其中一条消息失败,则进程必须冻结,直到问题得到解决,尽管所有其他进程都必须继续。对于这种情况,我考虑使用卡夫卡。我想到的第一个解决方案是使用消息键进行主题划分。消息的键将是ProcessId。通过这种方式,我可以确保所有流程消息都将被分区,卡夫卡将保证顺序。由于我对卡夫卡还不熟悉,我设法弄明白分区必须提前创建,这使得

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

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

当我向卡夫卡的主题生成不存在的消息时,该主题将在运行时创建。主题分区是否可能有相同的行为

创建主题时,需要指定分区数。新分区不会自动创建。主题创建就是这样,您必须使用主题工具更改分区的数量

更多信息:

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

该主题上可能有超过100000个活动分区,这是问题吗

是的,拥有这么多的分区会增加总体延迟。 讨论如何决定分区的数量

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

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

此外,卡夫卡文件指出


我想您选择了错误的特性来解决您的任务

通常,分区用于负载平衡。 传入消息将根据代理启动时定义的分区策略分布在给定数量的分区上。简而言之,默认策略只需计算分区的i=key\u hash mod number\u并将消息放入第i个分区。你可以阅读更多关于策略的内容 只有在分区内才能保证消息顺序。使用来自不同分区的两条消息,您将首先看到消费者。 也许你会用小组来代替。它是

每个组独立地使用来自主题的所有消息。 如果您需要,组可以由一个或多个消费者组成。 您可以分配许多组并添加新组,实际上,可以使用新的groupId动态添加新的消费者。 由于您可以停止/暂停任何消费者,因此您可以手动停止与指定组相关的所有消费者。我想没有一个命令可以做到这一点,但我不确定。无论如何,如果每个组中都有一个消费者,你可以很容易地阻止它。 如果要删除组,只需关闭并退出相关的使用者。不需要在代理端执行任何操作。 作为一个缺点,你会得到100000个阅读单一主题的消费者。至少网络负载很重