场景
已经应用了Saga模式,为了可靠性,每当服务状态改变时,服务必须以原子性方式发布事件。使用一个跨数据库和消息代理的分布式事务是不切实可行的。
问题
每当状态改变的时候,如何可靠地/原子地发布事件?
约束条件
2PC不是一个选项。
解决方案
应用将事件插入到某个EVENTS表中作为本地事务的一部分。某个独立的进程拉取EVENTS表并且将事件发布到消息代理中。
影响
该模式有如下的优点:
高级别的领域事件
无2PC
该模式有如下的弊端:
需要改变应用,可能会导致容易发生错误
很难避免重复发布
很难按顺序发布事件
仅仅对SQL和某些NoSQL数据库有效