问题描述:
使用跨数据库和消息代理的分布式事务来自动更新数据库并发布消息/事件是不可行的。
发件箱模式描述了一种让服务以安全和一致的方式执行这两个任务的方法;它为源服务提供即时的“读你自己写”语义,同时跨服务边界提供可靠的、最终一致的数据交换。
如果我从topica->write一条消息到topicb(kafka streams只有一次语义)并使用eventlistener更新数据库,那么会有什么不利之处?
这意味着在数据库实体被分发之前,我将拥有最终的一致性,但是由于我在kafka主题中有消息(在持久性工作之前重试),所以不会丢失数据。
这种模式还存在以下问题:
消息中继可能多次发布消息。例如,它可能在发布消息后但在记录它已经这样做的事实之前崩溃。当它重新启动时,它将再次发布消息。因此,消息使用者必须是幂等的,可能是通过跟踪它已经处理的消息的id来实现的。幸运的是,由于消息使用者通常需要是幂等的(因为消息代理可以多次传递消息),这通常不是问题。
问题:
因此,当涉及到妥协时,最好的办法是,让Kafka成为真相的唯一来源,处理数据库中最终的一致性,或者让数据库成为真相的来源,把Kafka当作一个愚蠢的消息代理?
我真的对你的意见很感兴趣!谢谢!
1条答案
按热度按时间utugiqy61#
我不知道你是否真的需要这个流处理器。也许一个好的方法是将数据写入数据库,并使用cdc连接器将数据流传输到kafka。cdc将跟踪db表的事务日志,并反映对kafka主题的更改。即使在连接失败的情况下,一旦重新启动,主题最终也会与db状态同步