官术网_书友最值得收藏!

1.4.3 數(shù)據(jù)一致性

由于數(shù)據(jù)架構(gòu)需要提供多節(jié)點部署,不同節(jié)點之間通信存在數(shù)據(jù)差異,在很多場景下往往會產(chǎn)生臟數(shù)據(jù)、異常數(shù)據(jù),讓業(yè)務不能正常運轉(zhuǎn)。數(shù)據(jù)一致性指關(guān)聯(lián)數(shù)據(jù)之間的邏輯關(guān)系是否正確和完整。那么在分布式情況下如何讓不同模塊之間的數(shù)據(jù)保證完整性、一致性?

可以從系統(tǒng)構(gòu)建層面考慮,采用分布式事務處理,犧牲一部分性能去保證數(shù)據(jù)一致性。

【示例】 電商系統(tǒng)

在購物平臺看中一款商品,然后加入購物車,下單成功后生成訂單,支付成功后扣除賬戶余額,然后通知倉庫發(fā)貨,生成物流軌跡。如果商品庫存、訂單、支付、倉庫等應用模塊獨立部署,各模塊之間通過遠程調(diào)用,則正常流程是所有應用模塊調(diào)用都正常返回。若出現(xiàn)異常,需要考慮以下場景。

1)商品庫存數(shù)量已扣除,訂單正常下單成功,由于網(wǎng)絡異常等原因,提示用戶“下單失敗”,用戶刷新頁面后,顯示一個“未支付訂單”;

2)訂單正常下單成功,用戶支付成功后,由于網(wǎng)絡異常等原因,提示用戶“支付失敗”,用于刷新頁面后,顯示“已支付成功”;

3)用戶支付成功后,通知倉庫發(fā)貨,由于網(wǎng)絡異常等原因,倉庫系統(tǒng)未發(fā)貨,無軌跡;

4)用戶支付成功后,通知倉庫發(fā)貨,倉庫可能沒有貨品,但商品數(shù)量已扣減,用戶余額已扣除等。

系統(tǒng)拆分成多個應用模塊后,往往會存在數(shù)據(jù)不一致性等問題,不同模塊之間通過遠程調(diào)用存在多種不確定因素,如調(diào)用過程中順序不同,網(wǎng)絡、寬帶、超時等一系列問題,增加了系統(tǒng)復雜性。

假如把商品庫存、訂單、支付、倉庫多個應用模塊并行調(diào)用,也就是同時調(diào)用這些模塊進行業(yè)務處理,由于同時調(diào)用不同模塊存在延遲、網(wǎng)絡異常等情況,需要設定合理的超時機制。并行執(zhí)行過程中任意模塊執(zhí)行失敗或者超時時,模塊執(zhí)行狀態(tài)差異需要通過消息發(fā)布/訂閱等模式,通知以上全部模塊進行失敗處理,相關(guān)模塊收到消息后,進行冪等處理,進而執(zhí)行失敗處理。

注意

保證消息發(fā)布/訂閱的可用性、可靠性,讓業(yè)務模塊都能正常接收消息。任意模塊執(zhí)行失敗或者超時等情況出現(xiàn)時,由于涉及模塊眾多,業(yè)務復雜,應通知相關(guān)模塊進行失敗處理。

主站蜘蛛池模板: 舟山市| 修文县| 和林格尔县| 孟州市| 惠来县| 新巴尔虎右旗| 页游| 晋江市| 西丰县| 峨眉山市| 湘乡市| 涟源市| 焉耆| 巧家县| 永善县| 禹城市| 宁陵县| 肥东县| 贵阳市| 额敏县| 泊头市| 会同县| 文山县| 上杭县| 北京市| 思茅市| 增城市| 思茅市| 无为县| 凉城县| 吉木乃县| 昌江| 资溪县| 饶河县| 泗洪县| 新竹市| 项城市| 抚顺县| 平江县| 定州市| 西华县|