衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

微服務之間涉及到的數據依賴問題應該怎么處理呢?

jf_ro2CN3Fa ? 來源:CSDN ? 2023-06-15 10:05 ? 次閱讀

曾經設計的一個供應鏈系統中,存在商品銷售訂單采購 這三個服務,它們的主數據的部分結構如下所示:

商品

ID 名稱 分類 型號 生產年份 編碼

訂單和子訂單

訂單ID 下單時間 客戶 總金額 子訂單ID 商品ID 單價 數量

采購單和子訂單

采購單ID 下單時間 供應商 總金額 采購子訂單ID 商品ID 單價 數量

在設計這個供應鏈系統時,我們需要滿足以下兩個需求:

根據商品的型號/分類/生成年份/編碼 等查找訂單;

根據商品的型號/分類/生成年份/編碼 等查找采購訂單。

初期我們的方案是這樣設計的:嚴格按照的微服務劃分原則將商品相關的職責存放在商品系統中。因此,在查詢訂單與采購單時,如果查詢字段包含商品字段,我們需要按照如下順序進行查詢:

先根據商品字段調用商品的服務,然后返回匹配的商品信息

在訂單或采購單中,通過 IN 語句匹配商品 ID,再關聯查詢對應的單據。

為了方便理解這個過程,訂單查詢流程圖如下圖所示:

03fa31c2-0b1d-11ee-962d-dac502259ad0.png

初期方案設計完后,很快我們就遇到了一系列問題:

隨著商品數量的增多,匹配的商品越來越多,于是訂單服務中包含 IN 語句的查詢效率越來越慢

商品作為一個核心服務,依賴它的服務越來越多,同時隨著商品數據量的增長,商品服務已不堪重負,響應速度也變慢,還存在請求超時 的情況

由于商品服務超時,相關服務處理請求經常失敗。

結果就是業務方每次查詢訂單或采購單時,只要帶上了商品這個關鍵字,查詢效率就會很慢而且老是失敗。于是,我們重新想了一個新方案——數據冗余 ,下面我們一起來看下。

1、數據冗余的方案

數據冗余說白了就是在訂單、采購單中保存一些商品字段 信息。

為了方便理解,我們借助上面實際業務場景具體說明下,看看兩者的區別。

商品

ID 名稱 分類ID 型號 生產年份ID 編碼

訂單和子訂單

訂單ID 下單時間 客戶 總金額
子訂單ID 商品ID 單價 數量 商品名稱 商品分類ID 商品型號 生產批次ID

采購單和子訂單

采購單ID 下單時間 供應商 總金額
采購子訂單ID 商品ID 單價 數量 商品名稱 商品分類ID 商品型號 生產批次ID

調整架構方案后,每次查詢時,我們就可以不再依賴商品服務了

但是,如果商品進行了更新,我們如何同步冗余的數據呢?在此分享2種 解決辦法。

每次更新商品時,先調用訂單與采購服務,再更新商品的冗余數據。

每次更新商品時,先發布一條消息,訂單與采購服務各自訂閱這條消息后,再各自更新商品冗余數據。

那么這2種方案會出現哪些問題呢?

如果商品服務每次更新商品都要調用訂單與采購服務,然后再更新冗余數據,則會出現以下兩種問題。

數據一致性問題 :如果訂單與采購的冗余數據更新失敗了,整個操作都需要回滾。這時商品服務的開發人員肯定不樂意,因為冗余數據不是商品服務的核心需求,不能因為邊緣流程阻斷了自身的核心流程。

依賴問題 :從職責來說,商品服務應該只關注商品本身,但是現在商品還需要調用訂單與采購服務。而且,依賴商品這個核心服務的服務實在是太多了,也就導致后續商品服務每次更新商品時,都需要調用更新訂單冗余數據、更新采購冗余數據、更新門店庫存冗余數據、更新運營冗余數據等一大堆服務。那么商品到底是下游服務還是上游服務?還能不能安心當底層核心服務?

因此,第一個解決辦法直接被我們否決了,即我們采取的第二個解決辦法——通過消息發布訂閱的方案 ,因為它存在如下 2 點 優勢:

商品無須調用其他服務,它只需要關注自身邏輯即可,頂多多生成一條消息送到 MQ

如果訂單、采購等服務的更新冗余數據失敗了,我們使用消息重試機制 就可以了,最終能保證數據的一致性。

此時,我們的架構方案如下圖所示:

040a9b20-0b1d-11ee-962d-dac502259ad0.png

這個方案看起來已經挺完美了,而且市面上基本也是這么做的,不過該方案存在如下幾個問題。

1、在這個方案中,僅僅保存冗余數據還遠遠不夠,我們還需要將商品分類與生產批號的清單進行關聯查詢。也就是說,每個服務不只是訂閱商品變更這一種消息,還需要訂閱商品分類、商品生產批號變更等消息。下面請注意查看訂單表結構的紅色加粗部分內容。

訂單ID 下單時間 客戶 總金額
子訂單ID 商品ID 單價 數量 商品名稱 商品分類ID 商品型號 生產批次ID

以上只是列舉了一部分的結構,事實上,商品表中還有很多字段存在冗余,比如保修類型、包換類型等。為了更新這些冗余數據,采購服務與訂單服務往往需要訂閱近十種消息,因此,我們基本上需要把商品的一小半邏輯復制過來。

2、每個依賴的服務需要重復實現冗余數據更新同步的邏輯。前面我們講了采購、訂單及其他服務都需要依賴商品數據,因此每個服務需要將冗余數據的訂閱、更新邏輯做一遍,最終重復的代碼就會很多。

3、MQ 消息類型太多了:聯調時最麻煩的是 MQ 之間的聯動,如果是接口聯調還好說,因為調用哪個服務器的接口相對可控而且比較好追溯;如果是消息聯調就比較麻煩,因為我們常常不知道某條消息被哪臺服務節點消費了,為了讓特定的服務器消費特定的消息,我們就需要臨時改動雙方的代碼。不過聯調完成后,我們經常忘了改回原代碼。

為此,我們不希望針對冗余數據這種非核心需求出現如此多的問題,最終決定使用一個特別的同步冗余數據方案,接下來我們進一步說明。

2、解耦業務邏輯的數據同步方案

解耦業務邏輯的數據同步方案的設計思路是這樣的:

將商品及商品相關的一些表(比如分類表、生產批號表、保修類型、包換類型等)實時同步到需要依賴使用它們的服務的數據庫,并且保持表結構不變;

在查詢采購、訂單等服務時,直接關聯同步過來的商品相關表;

不允許采購、訂單等服務修改商品相關表。

此時,整個方案的架構如下圖所示:

0420131a-0b1d-11ee-962d-dac502259ad0.png

以上方案就能輕松解決如下兩個問題:

商品無須依賴其他服務,如果其他服務的冗余數據同步失敗,它也不需要回滾自身的流程;

采購、訂單等服務無須關注冗余數據的同步。

不過,該方案的“缺點 ”是增加了訂單、采購等數據庫的存儲空間(因為增加了商品相關表)。

仔細計算后,我們發現之前數據冗余的方案中每個訂單都需要保存一份商品的冗余數據,假設訂單總數是 N,商品總數是 M,而 N 一般遠遠大于 M。因此,在之前數據冗余的方案中,N 條訂單就會產生 N 條商品的冗余數據。相比之下,解耦業務邏輯的數據同步方案更省空間,因為只增加了 M 條商品的數據。

此時問題又來了,如何實時同步相關表的數據呢?

我們直接找一個現成的開源中間件就可以了,不過它需要滿足支持實時同步、支持增量同步、不用寫業務邏輯、支持 MySQL 之間同步、活躍度高這五點要求。

根據這五點要求,我們在市面上找了一圈,發現了 CanalDebeziumDataXDatabusFlinkxBifrost 這幾款開源中間件,它們之間的區別如下表所示:

04534faa-0b1d-11ee-962d-dac502259ad0.png

從對比表中來看,比較貼近我們需求的開源中間件是 Bifrost ,原因如下:

它的界面管理不錯;

它的架構比較簡單,出現問題后,我們可以自行調查,之后就算作者不維護了也可以自我維護,相對比較可控。

作者更新活躍;

自帶監控報警功能。

因此,最終我們使用了 Bifrost 開源中間件,此時整個方案的架構如下圖所示:

046fa100-0b1d-11ee-962d-dac502259ad0.png

3、最終效果

整個架構方案上線后,商品數據的同步還算比較穩定,此時商品服務的開發人員只需要關注自身邏輯,無須再關注使用數據的人。如果需要關聯使用商品數據的訂單,采購服務的開發人員也無須關注商品數據的同步問題,只需要在查詢時加上關聯語句即可,實現了雙贏。

然而,唯一讓我們擔心的是 Bifrost 不支持集群,沒法保障高可用性。不過,到目前為止,它還沒有出現宕機的情況,反而是那些部署多臺節點負載均衡的后臺服務常常會出現宕機。

最終,我們總算解決了服務之間數據依賴的問題。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 解耦控制
    +關注

    關注

    0

    文章

    29

    瀏覽量

    10234
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    96

    瀏覽量

    9453
  • Bifrost架構
    +關注

    關注

    0

    文章

    2

    瀏覽量

    3300

原文標題:微服務之間的數據依賴問題,該如何解決?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    開發板上涉及到的模塊

    開發板上涉及到的模塊
    發表于 09-23 18:59

    使用阿里云ACM簡化你的Spring Cloud微服務環境配置管理

    的配置差異很大,那么你可能就只能在一套環境中發現某個特定的問題,這是極其痛苦的事情。所以,如果存在不同環境之間的配置差異,應該如何在部署流程中對其進行處理?一種方法是對每個環境創建不
    發表于 07-04 17:16

    區塊鏈應用涉及到哪些算法?

    區塊鏈技術的應用涉及到哪些算法模型?
    發表于 03-27 11:21

    微服務架構和CQRS架構基本概念介紹

    邊界思維,微服務的目的是為了從業務角度拆分(職責分離)當前業務領域的不同業務模塊不同的服務,每個微服務之間
    發表于 05-22 09:03

    中斷系統涉及到哪些問題

    在開始寫中斷函數之前,我們來一起回顧一下,單片機的中斷系統。中斷的意思(學習過微機原理與接口技術的同學,沒學過單片機,也應該知道),我們在這里就不講了,首先來回憶下中斷系統涉及到哪些問題。(1)中斷
    發表于 07-15 09:32

    51單片機工程涉及到的模塊包括哪些?

    51單片機工程涉及到的模塊包括哪些?如何去編寫51單片機工程涉及的模塊代碼?
    發表于 07-19 08:38

    嵌入式需要涉及到哪些知識

    開發linux嵌入式產品的過程是怎樣的?嵌入式需要涉及到哪些知識
    發表于 11-12 07:35

    微服務網關gateway的相關資料推薦

    采用微服務架構,顯示在產品頁上的數據會分布在不同的微服務上,比如:購物車服務——購物車中的件數訂單服務——歷史訂單目錄
    發表于 12-23 08:19

    數據鏈路層發送與接收的處理過程及涉及到的模塊

    數據鏈路層包括發送和接收兩個部分,本章主要介紹數據流從進入發射器的數據鏈路層從接收器的數據
    發表于 02-08 10:27 ?1w次閱讀

    運維是如何看待微服務和容器的

    微服務在帶來良好的設計和架構理念的同時,也帶來了運維上的額外復雜性,尤其是在服務部署和服務監控上。那么,運維是如何看待微服務和容器的?傳統
    發表于 09-30 17:24 ?0次下載
    運維是如何看待<b class='flag-5'>微服務</b>和容器的

    自動駕駛技術涉及到的AI科技

    隨著人工智能技術的不斷發展,人們急切的希望這項技術能夠盡快的落地成熟,那么自動駕駛技術到底涉及到哪些科技?現有的產品到底是處于什么階段
    的頭像 發表于 11-25 09:26 ?6257次閱讀
    自動駕駛技術<b class='flag-5'>涉及到</b>的AI科技

    微服務和容器之間的有何關系?

    現在一提到微服務,有很多人會想到容器技術(這里說到的容器技術是指docker)。那么微服務和容器之間到底有什么關系,我來簡要和大家探討下。先拋出結論:
    的頭像 發表于 02-01 01:58 ?6185次閱讀

    微服務循環依賴調用引發的血案

    順著測試匯報的出現問題的場景,跟蹤調用鏈上相關服務的日志,發現出現了微服務之間依賴調用。大致情況可以抽象如下所示(圖中所有調用都是 http 協議)
    的頭像 發表于 01-16 10:28 ?747次閱讀

    微服務架構中的服務之間如何互相調用

    微服務架構中,需要調用很多服務才能完成一項功能。服務之間如何互相調用就變成微服務架構中的一個關鍵問題。
    的頭像 發表于 01-31 09:46 ?2265次閱讀

    從分層架構微服務架構介紹(五)

    本文要介紹的是 服務化架構 (Service-Based Architecture, SBA )。 SBA 可以看成是單體架構和微服務架構之間的一個折中方案,它也是按照業務領域進行服務
    的頭像 發表于 05-10 17:02 ?885次閱讀
    從分層架構<b class='flag-5'>到</b><b class='flag-5'>微服務</b>架構介紹(五)
    大发888最新信息| 百家乐赌博博彩赌博网| 百家乐平台下载| 百家乐最新破| 最可信百家乐官网娱乐城| 金百亿百家乐娱乐城| 百家乐赢一注| 娱乐城百家乐论坛| 南宁百家乐的玩法技巧和规则| 大发888娱乐城帝豪| 阿坝| ag百家乐官网下载| 赌场百家乐技巧| 红9百家乐的玩法技巧和规则| 娱乐百家乐下载| 波音代理| 老虎机遥控器| 澳门百家乐官网上下限| 网上百家乐官网是真的| qq百家乐网络平台| 大发8888备用网址| 百家乐官网赢新全讯网| 百家乐官网网上真钱娱乐场开户注册| 至尊百家乐facebook| 大发888游戏交易平台| 莲花县| 百家乐官网出千桌| 星期8百家乐娱乐城| 六合彩下注网| 如何打百家乐官网的玩法技巧和规则 | 真人百家乐蓝盾娱乐网| 娱乐城开户| 永利百家乐官网娱乐网| 百家乐扑克多少张| 现金轮盘游戏| 百家乐官网一邱大师打法| 马牌百家乐的玩法技巧和规则 | 大发888网页游戏| 卡宾娱乐| 百家乐官网赢钱秘籍鹰| 路单百家乐的玩法技巧和规则|