場景
已經(jīng)應(yīng)用了Saga模式,為了可靠性,每當(dāng)服務(wù)狀態(tài)改變時,服務(wù)必須以原子性方式發(fā)布事件。使用一個跨數(shù)據(jù)庫和消息代理的分布式事務(wù)是不切實可行的。
問題
每當(dāng)狀態(tài)改變的時候,如何可靠地/原子地發(fā)布事件?
約束條件
2PC不是一個選項。
解決方案
應(yīng)用將事件插入到某個EVENTS表中作為本地事務(wù)的一部分。某個獨立的進(jìn)程拉取EVENTS表并且將事件發(fā)布到消息代理中。
影響
該模式有如下的優(yōu)點:
高級別的領(lǐng)域事件
無2PC
該模式有如下的弊端:
需要改變應(yīng)用,可能會導(dǎo)致容易發(fā)生錯誤
很難避免重復(fù)發(fā)布
很難按順序發(fā)布事件
僅僅對SQL和某些NoSQL數(shù)據(jù)庫有效