outbox架構解說

Outbox?模式是一種用于實現數據一致性的架構模式,特別是在微服務架構中。

它確保在處理事務時,數據的原子性和最終一致性。

Outbox?模式的詳細解說:

1.?概念與背景

  • 背景:在微服務架構中,一個操作可能涉及多個服務,每個服務都有自己的數據庫。
  • 為了保證數據的一致性,通常需要使用分布式事務。
  • 然而,傳統的兩階段提交(2PC)等分布式事務機制在微服務環境中實現復雜且性能較低。
  • 概念:Outbox?模式通過將事件或消息的發布與數據庫事務綁定在一起,確保在事務提交后,事件或消息能夠被可靠地發布。

2.?工作原理

Outbox?模式的核心思想是將事件或消息存儲在數據庫的同一個事務中,然后通過一個單獨的進程或服務將這些事件或消息發布出去。

具體步驟如下:

1.事務開始:應用程序開始一個數據庫事務,包含對業務數據的修改和事件或消息的插入。

2.插入事件:在同一個事務中,將事件或消息插入到一個專門的?"outbox"?表中。

3.事務提交:提交事務。如果事務成功,事件或消息也被持久化到數據庫中。

4.事件發布:一個單獨的進程或服務(通常稱為?"outbox?processor"?或?"message?relay")定期輪詢?"outbox"?表,將新事件或消息發布到消息代理(如?Kafka、RabbitMQ?等)。

5.事件刪除:發布成功后,事件或消息從?"outbox"?表中刪除。

    3.?優點

    • 原子性:確保業務數據和事件或消息的原子性,避免數據不一致。
    • 可靠性:通過數據庫事務保證事件的持久化,避免消息丟失。
    • 解耦:將事件發布與業務邏輯解耦,簡化系統架構。
    • 可擴展性:適用于高并發和大規模分布式系統。

    4.?缺點

    • 復雜性:引入了額外的組件和流程,增加了系統復雜性。
    • 延遲:事件發布可能會有一定的延遲,因為需要等待?outbox?processor?處理。
    • 數據庫負載:額外的插入和查詢操作可能會增加數據庫的負載。

    5.?實現方式

    • 數據庫表:使用一個專門的?"outbox"?表來存儲事件或消息。
    • 輪詢機制:outbox?processor?定期輪詢?"outbox"?表,發布新事件或消息。
    • 事務日志:另一種實現方式是使用數據庫的事務日志(如?MySQL?的?binlog)來捕獲事件,然后通過?CDC(Change?Data?Capture)工具發布事件。

    6.?示例

    假設有一個訂單服務,當創建訂單時,需要同時更新訂單表并發送一個?"訂單創建"?事件到消息代理。

    用Outbox?模式的具體步驟如下:

    1.開始事務

    BEGIN TRANSACTION;
    

    2.插入訂單

    INSERT INTO orders (id, customer_id, amount, status) VALUES (1, 100, 250, 'pending');
    

    3.插入事件

    INSERT INTO outbox (id, event_type, payload, created_at) VALUES (1, 'OrderCreated', '{"orderId":1,"customerId":100,"amount":250}', NOW());
    

    4.提交事務

    COMMIT;
    

    5.事件發布:outbox?processor?定期查詢?outbox?表,發布事件到消息代理,然后刪除已發布的事件。

      7.?與其他模式的比較

      • Transactional Outbox vs. Transactional Messaging
        • Transactional Outbox:使用數據庫表存儲事件,然后通過輪詢或?CDC?發布事件。
        • Transactional Messaging:直接在事務中發送消息到消息代理,可能需要兩階段提交。

      8.?總結

      Outbox?模式是一種有效的數據一致性解決方案,特別適用于微服務架構。

      它通過將事件或消息的發布與數據庫事務綁定在一起,確保了數據的原子性和最終一致性。

      雖然引入了額外的復雜性和延遲,但提供了更高的可靠性和可擴展性。

      聯系方式:https://t.me/XMOhost26

      交流技術群:https://t.me/owolai007

      本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
      如若轉載,請注明出處:http://www.pswp.cn/news/906421.shtml
      繁體地址,請注明出處:http://hk.pswp.cn/news/906421.shtml
      英文地址,請注明出處:http://en.pswp.cn/news/906421.shtml

      如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

      相關文章

      噴涂噴漆機器人詳解

      1. 定義 噴涂噴漆機器人是專為表面涂裝設計的自動化工業設備,通過精準控制實現高效、均勻的涂料噴涂。其核心價值在于提升生產效率、保障質量一致性,同時減少材料浪費及環境污染,廣泛應用于汽車、航空航天等領域。 2. 結構組成 機械臂&…

      DataX:一個開源的離線數據同步工具

      DataX 是一個異構數據源離線同步(ETL)工具,實現了包括關系型數據庫(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各種異構數據源之間穩定高效的數據同步功能。它也是阿里云 DataWorks 數據集成功能的開源版本。 為了解決異構數據源同…

      微軟家各種copilot的AI產品:Github copilot、Microsoft copilot

      背景 大家可能聽到很多copilot,比如 Github Copilot,Microsoft Copilot、Microsoft 365 Copilot,有什么區別 Github Copilot:有網頁版、有插件(idea、vscode等的插件),都是面向于程序員的。Mi…

      SpringMVC04所有注解按照使用位置劃分| 按照使用層級劃分(業務層、視圖層、控制層)

      目錄 一、所有注解按照使用位置劃分(類、方法、參數) 1. 類級別注解 2. 方法級別注解 3. 參數級別注解 4. 字段/返回值注解 二、按照使用層級劃分(業務層、視圖層、控制層) 1、控制層(Controller Layer&#x…

      std::chrono類的簡單使用實例及分析

      author: hjjdebug date: 2025年 05月 20日 星期二 14:36:17 CST descrip: std::chrono類的簡單使用實例及分析 文章目錄 1.實例代碼:2. 代碼分析:2.1 auto t1 std::chrono::high_resolution_clock::now();2.1.1 什么是 system_clock2.1.2 什么是 chrono::time_point?2.1.3 什…

      電子電路仿真實驗教學平臺重磅上線!——深圳航天科技創新研究院傾力打造,助力高校教學數字化轉型

      在傳統電子電路課堂中,實驗室的燈光總與高昂的成本、擁擠的設備、反復的耗材損耗相伴,而教師不得不面對這樣的現實:有限的硬件資源束縛著教學深度,不可逆的實驗風險制約著創新探索,固化的時空場景阻礙著個性化學習。當…

      面試真題 - 高并發場景下Nginx如何優化

      Nginx是一款高性能的Web服務器和反向代理服務器,以其輕量級、高并發處理能力和穩定性聞名。在面對高并發場景時,合理的配置與優化策略至關重要,以確保服務的穩定性和響應速度。 以下是針對Nginx進行高并發優化的一些關鍵配置和策略&#xff…

      算法與數據結構:質數、互質判定和裴蜀定理

      文章目錄 質數質數判定質數篩選質因數分解互質判定裴蜀定理 質數 首先回顧「質數」的定義:若一個正整數無法被除了 1 ?和它自身之外的任何自然數整除,則稱該數為質數(或素數),否則稱該正整數為合數。 根據上述定義&…

      代碼隨想錄算法訓練營第60期第四十二天打卡

      大家好,今天還是繼續我們的動態規劃里面的背包問題,前面我們主要接觸的是0-1背包和完全背包,其實這兩個背包問題主要就是看看每一件物品我們是否有多件,如果每一件物品我們只能取一次的話那這樣我們就是0-1背包,如果每…

      第41天-Python+Qt四屏播放器開發指南

      一、技術選型與工具準備 核心庫: Pyqt5:Python標準GUI庫,構建用戶界面 os / sys:文件系統操作 開發環境: pip install pyqt5 最終效果與運行 import sys from PyQt5.QtWidgets import QVBoxLayout, QHBoxLayout # 添加缺失的布局管理器 from PyQt5.QtCore impor…

      upload-labs通關筆記-第12關 文件上傳之白名單GET法

      目錄 一、白名單過濾 二、%00截斷 1、%00截斷原理 2、空字符 3、截斷條件 &#xff08;1&#xff09;PHP版本 < 5.3.4 &#xff08;2&#xff09;magic_quotes_gpc配置為Off &#xff08;3&#xff09;代碼邏輯存在缺陷 三、源碼分析 1、代碼審計 &#xff08;1&…

      Node.js數據抓取技術實戰示例

      Node.js常用的庫有哪些呢&#xff1f;比如axios或者node-fetch用來發送HTTP請求&#xff0c;cheerio用來解析HTML&#xff0c;如果是動態網頁的話可能需要puppeteer這樣的無頭瀏覽器。這些工具的組合應該能滿足大部分需求。 然后&#xff0c;可能遇到的難點在哪里&#xff1f;…

      數據結構(3)線性表-鏈表-單鏈表

      我們學習過順序表時&#xff0c;一旦對頭部或中間的數據進行處理&#xff0c;由于物理結構的連續性&#xff0c;為了不覆蓋&#xff0c;都得移&#xff0c;就導致時間復雜度為O&#xff08;n&#xff09;&#xff0c;還有一個潛在的問題就是擴容&#xff0c;假如我們擴容前是10…

      【Unity】DOTween的常用函數解釋

      DOTween插件常用函數解釋 1.DOTween.To&#xff08;通用變化動畫&#xff09; 解釋&#xff1a;將某一個值在一定的時間內變化到另一個值&#xff08;通用的函數&#xff09;&#xff0c;可用于大部分的動畫變化 使用示例&#xff1a; using UnityEngine; using DG.Tweenin…

      數據結構測試模擬題(1)

      1、約瑟夫問題 #include<bits/stdc.h> using namespace std; const int N25; int e[N],ne[N],head-1,idx1; int n,m; void add_to_head(int x){e[idx]x;ne[idx]head;headidx; } void add(int k,int x){e[idx]x;ne[idx]ne[k];ne[k]idx; } int main(){cin>>n>>…

      Helm配置之為特定Deployment配置特定Docker倉庫(覆蓋全局配置)

      文章目錄 Helm配置之為特定Deployment配置特定Docker倉庫(覆蓋全局配置)需求方法1:使用Helm覆蓋值方法2: 在Lens中臨時修改Deployment配置步驟 1: 創建 Docker Registry Secret步驟 2: 在 Deployment 中引用 Secret參考資料Helm配置之為特定Deployment配置特定Docker倉庫(覆…

      BERT 作為Transformer的Encoder 為什么采用可學習的位置編碼

      摘要 BERT 在位置編碼上與原始 Transformer 論文中的 sin/cos 公式不同&#xff0c;選擇了可學習&#xff08;learned&#xff09;的位置嵌入方案。本文將從 Transformer 原始位置編碼選項入手&#xff0c;分析 BERT 選擇 learned positional embeddings 的四大核心原因&#x…

      【Linux 學習計劃】-- gcc、g++、動靜態庫鏈接

      目錄 什么是gcc、g gcc、g 相關操作詳解 預處理、編譯、匯編、鏈接來源 動靜態鏈接是什么 結語 什么是gcc、g gcc、g其實就是編譯器&#xff0c;是幫助我們從.c或者.cc&#xff0c;.cpp文件編譯成可執行程序的 其中&#xff0c;我們如果要編譯c語言文件的話&#xff0c;…

      前端讀取本地項目中 public/a.xlsx 文件中的數據 vue3

      前端讀取本地項目中 public/a.xlsx 文件中的數據 vue3 項目中需要在 Vue3 項目中讀取 public/a.xlsx 文件&#xff0c;可以使用 fetch API 來獲取文件內容 一、安裝 xlsx 首先&#xff0c;你需要安裝 xlsx 庫&#xff1a; npm install xlsx二、在需要用的頁面里引入xlsx im…

      MySQL:to many connections連接數過多

      當你遇到 MySQL: Too many connections 錯誤時&#xff0c;意味著當前連接數已達到 MySQL 配置的最大限制。這通常是由于并發連接過多或連接未正確關閉導致的。 一、查看當前連接數 查看 MySQL 當前允許的最大連接數 SHOW VARIABLES LIKE max_connections;查看當前使用的最大…