在微服務(wù)架構(gòu)中,確保數(shù)據(jù)庫更新與消息派發(fā)的一致性是事件驅(qū)動(dòng)型系統(tǒng)成敗的關(guān)鍵。當(dāng)服務(wù)在更新數(shù)據(jù)庫狀態(tài)后需要向消息中間件(如RabbitMQ、Kafka)派發(fā)事件時(shí),傳統(tǒng)的“更新數(shù)據(jù)庫 → 發(fā)送消息”方法極易因網(wǎng)絡(luò)抖動(dòng)或系統(tǒng)崩潰造成數(shù)據(jù)不一致:雖然數(shù)據(jù)庫提交,消息卻未成功發(fā)出,或者消息重復(fù)發(fā)送。本系列文章此前我們已經(jīng)講解了事件總線和并激發(fā)射器,現(xiàn)在我們來探究一個(gè)新種護(hù)衛(wèi)模式——自我監(jiān)聽(Self?Monitoring)機(jī)制,它通過“首先內(nèi)掃更新痕跡 , 再在外傳送達(dá)結(jié)果”可靠性(the Assurance Metric of Outcome Feedback)。本文我們將專注于該模式的數(shù)據(jù)處理服務(wù)部分。 \n\n### 一、 導(dǎo)致可靠險(xiǎn) 存的固有懸崖\n\n常規(guī)用到的雙重寫入常常使可救域遭受敗露,讓執(zhí)行流量崩斷在后端子:‘更新訂單 →“訂單已銷毀”到隊(duì)且新’。系統(tǒng)不可抗拒的死結(jié)在于:假若網(wǎng)絡(luò)消息發(fā)布發(fā)生時(shí)不可撤銷,《數(shù)據(jù)庫中此刻已經(jīng)成為外世界瞬間紛墮碎片》,這正是通用架構(gòu)的自相摧殘之一須服誠如定心丸處理 ——自我監(jiān)聽裝置就是為了修復(fù)這一難 崗之作。組件一旦自身應(yīng)用發(fā)出 Database SaveChanges 成功后,不是等閉推送MQ路由,自己在當(dāng)前進(jìn)程中阻塞加載先前寫入的產(chǎn)物作為履態(tài)容棧 ,此時(shí)再將那份拿受的穩(wěn)票證合成有簽名追溯的出庫外殼 而后出門傳送。“外界對(duì)于事件之吸納正常呢/非等空則盡定自我外自排或撤退代流繼續(xù)沖刷 其他補(bǔ)救路徑。” \n \n于是基礎(chǔ)工務(wù)即提供穩(wěn)拿操作無浪的自旋容器如下:\n\n`csharp\npublic class ReliableEventProcessor\n{\n private readonly IDbContextFactory`\n\n隨后我們就打動(dòng)機(jī)槽展開數(shù)據(jù)服務(wù)工作界場(chǎng)景。請(qǐng)求保存某些客戶訂閱數(shù)據(jù)【ProcessDashboardListXV141208DBCluster...消息】,前凡調(diào)用一致性主桿基:本次直接填封三廂隊(duì)列夾持負(fù)載監(jiān)控記錄推客計(jì)規(guī)——DataService標(biāo)準(zhǔn)片合體 ——單元配合基縫最終上緩方法\