我们有一个业务流程/工作流,在收到初始事件消息时启动,并在处理最后一条消息时关闭。我们每天最多执行100,000个流程。我的问题是,到达特定进程的消息的顺序必须由接收到的相同订单消息处理。如果其中一条消息失败,则该过程必须冻结,直到问题得到解决,尽管所有其他过程都必须继续。对于这种情况,我正在考虑使用Kafka。我想到的第一个解决方案是使用消息键进行主题分区。消息的关键是ProcessId。通过这种方式,我可以确保所有流程消息都将被分区,而kafka将保证订单。因为我是Kafka的新手,所以我设法弄清楚必须提前创建分区,这使得一切都变得困难。所以我的问题是:
1)当我向kafka的主题生成不存在的消息时,该主题是在运行时创建的。是否可以为主题分区提供相同的行为? 2)主题上可以有超过100,000个活动分区,这是一个问题吗? 3)在读取该主题的所有消息后,是否可以删除分区? 4)也许你可以建议我的问题的其他方法?
当我向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.
我想你选择了错误的功能来解决你的任务。
i=key_hash mod number_of_partitions
并将消息放入i
th分区。更多关于你可以阅读here的策略可能你会使用组代替。这是option for consumer
作为一个缺点,您将获得100,000个阅读(单个)主题的消费者。至少这是一个沉重的网络负载。