我现在正在学习微服务数据复制,而我遇到的一件事就是提出了确保事件原子性的正确架构.我理解它的方式,基本流程是:
提交对数据库的更改.
发布详细说明全局消息总线上的更改的事件.
但是,如果在步骤1和2之间发生断电,该怎么办?在一个天真的系统中,这意味着更改仍然存在,但详细说明它们的事件将永远不会发布.我考虑过以下想法来创造更好的保证,但我不太清楚每种方法的优点和缺点:
答:在我的微服务实例中使用嵌入式数据库(如SQLite)来跟踪从提交到主数据库到事件发布的完整事务.
B:在我的主数据库中创建一个事件表,使用数据库事务插入事件并同时提交相关更改.然后,该服务将事件推送到总线,然后再次提交到主数据库以将事件标记为已发布.
C:如上所述,在我的主数据库中创建一个Events表,使用数据库事务插入Event并同时提交相关更改.然后,通过(通过服务中的REST /消息或通过数据库挂钩手动)通知已附加新事件的专用EventPusher服务.EventPusher服务将查询Events表并将事件推送到总线,将每个事件标记为已发布确认.如果在没有任何通知的情况下经过一定的时间,EventPusher将进行手动查询.
以上每个选择的优缺点是什么?我还有其他优势吗?