自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

微服務(wù)架構(gòu)中的挑戰(zhàn)及應(yīng)對方式:Outbox 模式

開發(fā) 架構(gòu)
在一個由許多小型服務(wù)組成的系統(tǒng)中保持數(shù)據(jù)一致性是困難的,因為它們分散在各處。以下是一些常見問題以及如何處理它們的方法:當服務(wù)發(fā)送消息時,同時更新數(shù)據(jù)庫和發(fā)送消息是棘手的問題。

使用 Outbox 模式保持微服務(wù)數(shù)據(jù)一致性

在一個由許多小型服務(wù)組成的系統(tǒng)中保持數(shù)據(jù)一致性是困難的,因為它們分散在各處。以下是一些常見問題以及如何處理它們的方法:當服務(wù)發(fā)送消息時,同時更新數(shù)據(jù)庫和發(fā)送消息是棘手的問題。

在微服務(wù)中發(fā)出事件時,我們必須解決如何以事務(wù)方式更新數(shù)據(jù)庫并發(fā)出事件的問題。

Outbox 模式

處理這個問題的簡單方法是使用事務(wù)性 Outbox 模式。

問題:雙寫問題

當我們必須同時更新兩個不同的系統(tǒng)時,就會出現(xiàn)雙寫問題。例如,如果我們需要在 Apache Kafka 和數(shù)據(jù)庫中記錄事件。由于這些系統(tǒng)沒有連接,我們無法一次性更新它們。我們必須找到一種方法來確保兩者同時更新,或者兩者都不更新。這就是事務(wù)性 Outbox 模式發(fā)揮作用的地方。

如果我們的數(shù)據(jù)庫支持事務(wù)性更新,我們可以使用它來解決雙寫問題。我們將事務(wù)邏輯移到數(shù)據(jù)庫中,而不是嘗試同時更新數(shù)據(jù)庫和 Kafka。每當我們更新數(shù)據(jù)庫時,我們也在同一個事務(wù)中更新一個 Outbox 表??梢詫?Outbox 想象成一個郵箱,我們將需要發(fā)送的信件放在其中。然后,我們等待郵遞員收集這些信件并將其送到郵局。在我們的情況下,這些信件代表我們想要發(fā)送到 Kafka 的事件,而 Kafka 則充當郵局。但是,我們?nèi)匀恍枰撤N東西扮演郵遞員的角色。

要從 Outbox 表中發(fā)出事件到 Apache Kafka,我們可以使用一個單獨的進程來異步監(jiān)視該表。每當它檢測到事件時,就可以將其發(fā)送到 Kafka。

雙寫問題

一旦事件成功傳遞,它就可以從 Outbox 表中刪除。該進程通常是在原始微服務(wù)中的另一個線程中編寫的;但是,它也可以作為完全獨立的應(yīng)用程序運行。根據(jù)您使用的數(shù)據(jù)庫,您可能可以使用 Kafka 連接器(例如 Postgres-Kafka 連接器)或更改數(shù)據(jù)捕獲(CDC)系統(tǒng)(例如 Debezium)來監(jiān)視表并發(fā)送事件。

Kafka 連接器或更改數(shù)據(jù)捕獲(CDC)

使用 CDC 解決雙寫問題的優(yōu)勢

Outbox 事務(wù)模式避免了雙寫問題。原因是狀態(tài)和 Outbox 表將始終以事務(wù)方式更新。如果由于某種原因狀態(tài)未能更新,則事件不會寫入 Outbox;這意味著我們可以保證 Outbox 中的數(shù)據(jù)與數(shù)據(jù)庫中的數(shù)據(jù)完全同步。然后,負責將事件傳遞到 Kafka 的獨立進程確保 Outbox 表和 Kafka 保持同步。這使我們能夠保證每個數(shù)據(jù)庫操作都會在 Kafka 中有一個相應(yīng)的事件,盡管會有一點延遲。

缺點:當傳遞過程向 Kafka 發(fā)出事件時,可能會出現(xiàn)失敗或超時。在這種情況下,為了確保 Kafka 收到數(shù)據(jù),我們必須重試。這些重試可能導(dǎo)致重復(fù)的消息;因此,我們向 Kafka 的傳遞保證是至少一次的。我們保證 Outbox 中的每條消息最終都會到達 Kafka,但可能會重復(fù)到達。因此,我們需要確保下游系統(tǒng)準備好處理任何重復(fù)消息。

在分布式系統(tǒng)中,至少一次的保證是常見的,因此,即使不涉及雙寫問題,實現(xiàn)去重邏輯也是一個良好的做法。例如,接收方在處理 Kafka 消息時可能會失敗,并且當它重新啟動時可能會再次收到相同的消息。

Outbox 模式中的挑戰(zhàn)

我們必須準備好處理這些情況。這可能會導(dǎo)致大量的流量。頻繁的更新意味著數(shù)據(jù)庫可能會始終將表保存在內(nèi)存中,占用大量資源。與此同時,一些數(shù)據(jù)庫在處理刪除時效率不高。它們可能在幕后使用墓碑,并且隨著頻繁的插入和刪除發(fā)生,這些墓碑可能會累積,這會導(dǎo)致資源使用量大增,并在我們的表中引起爭用。如果數(shù)據(jù)庫無法處理此類流量,可能會減慢我們的應(yīng)用程序,因為請記住,每個寫入都將觸及該 Outbox 表。為了解決這些問題,我們可能需要進行調(diào)整,例如將記錄而不是刪除它們,或者調(diào)整數(shù)據(jù)庫管理墓碑的方式。保留事件可能會帶來長期的好處,因此刪除可能并非絕對必要。一些數(shù)據(jù)庫專門設(shè)計用于處理這種類型的流量。

結(jié)論

如果您的系統(tǒng)滿足事務(wù)性 Outbox 模式的要求,那么它可以是解決雙寫問題的一種簡單有效的方法。與其他選項(例如事件溯源或監(jiān)聽自己模式)相比,這種方法采用事件優(yōu)先的方法,使用 Kafka 實時通知微服務(wù)變更,保持系統(tǒng)一致性。但是,諸如訂單履行之類的組件可能需要編排,無法運行。


責任編輯:華軒 來源: 小技術(shù)君
相關(guān)推薦

2014-11-12 10:23:12

Docker容器IronWorker

2022-04-23 16:58:24

微服務(wù)微服務(wù)架構(gòu)

2022-04-15 11:37:19

密碼網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全

2019-09-29 10:29:02

緩存模式微服務(wù)架構(gòu)

2022-06-21 10:29:09

CIO首席信息官

2023-07-12 08:00:40

2022-08-14 07:04:44

微服務(wù)架構(gòu)設(shè)計模式

2022-08-07 22:11:25

微服務(wù)架構(gòu)

2022-08-08 13:55:47

通信設(shè)計模式微服務(wù)

2022-03-07 15:21:54

微服務(wù)組件運維

2010-09-30 10:44:43

2022-01-19 12:39:41

大數(shù)據(jù)

2010-09-13 18:11:38

2022-03-29 10:36:32

技術(shù)架構(gòu)微服務(wù)

2021-07-02 06:54:45

軟件架構(gòu)模式

2022-08-09 12:27:37

API集成微服務(wù)

2015-05-18 10:13:47

2020-11-02 10:50:21

爬蟲Python網(wǎng)絡(luò)

2023-11-27 16:39:09

數(shù)字化轉(zhuǎn)型
點贊
收藏

51CTO技術(shù)棧公眾號