我有一个关于处理Kafka流媒体中致命技术错误的推荐方法的问题。
脚本:
业务事务的所有消息都在一个分区中
重复处理消息会导致应用程序出现异常(与kafka无关)
我们不能跳过一条消息,因为顺序很重要(一个事务的所有消息需要一起处理)
kafka自动将分区分配给使用者(无需手动分配)
考虑到这些限制,
如果我停止使用者,那么带有问题消息的分区只会被分配给不同的使用者,同样的问题会重复出现。
如果我停止整个使用者组,我将延迟所有分区的处理,而如果它们仍在处理,我可以处理其他没有问题的事务。
对于这种情况,建议采取什么办法?
另外,是否可以在没有应用程序同步机制的情况下关闭整个使用者组(对于多节点使用者组)?
1条答案
按热度按时间vatpfxk51#
kafka streams只有一个语义,即消息只处理一次,即使在失败的情况下也是如此。你只需要设置
processing.guarantee=exactly_once
在流配置中。有关更多信息,请参阅以下文章。至于消息的顺序,它们是按产生的顺序被消耗的。因为事务中所有消息的键都是相同的,所以它们位于同一分区中(至少在默认分区逻辑中是这样)。
还可以使用中间主题来存储中间状态
KStream.through()
方法。除此之外,您还有状态存储(本地(仅分配给该示例的分区)和全局(所有分区))来存储您的状态。如果任何一个消费者死亡并被重新部署到其他地方(在另一个没有存储数据的节点中),那么状态存储将从kafka changelog构建。