1. 程式人生 > >不懂這些高併發分散式架構、分散式系統的資料一致性解決方案,你如何能找到高新網際網路工作呢?強勢解析eBay BASE模式、去哪兒及蘑菇街分散式架構

不懂這些高併發分散式架構、分散式系統的資料一致性解決方案,你如何能找到高新網際網路工作呢?強勢解析eBay BASE模式、去哪兒及蘑菇街分散式架構

網際網路行業是大勢所趨,從招聘工資水平即可看出,那麼如何提升自我技能,滿足網際網路行業技能要求?需要以目標為導向,進行技能提升,本文主要針對高併發分散式系統設計、架構(資料一致性)做了分析,祝各位早日走上屬於自己的"成金之路"。 目錄:
問題分析
概念解讀
Most Simple原理解讀
eBey、去哪兒、蘑菇街分散式事務案例分析 參考資料

1.問題解析    
要想做架構,必須識別出問題,即是誰的問題,什麼問題。
明顯的,分散式架構解決的是高併發的問題,高併發下服務高可用和資料一致性問題問題;當規模規模較小時,單庫HA即可滿足請求,當業務規模持續增加,單庫已經無法滿足業務需求,業界主流做法,是對業務進行分表、分庫,那麼原來的有些業務,現在則要在一個事務中,保證兩個庫同時操作成功或操作不成功(一個庫成功,一個庫失敗,要麼重新嘗試失敗庫操作直到成功,要麼回滾成功庫)。隨之而來的問題既是如何保證分庫時業務操作的資料一致性。理解高併發分散式架構、分散式系統資料一致性的問題、起源是第一步。 這裡多囉嗦一點,分庫後,每個庫可以採取不同的語言,以時下很流行的微服務向外提供服務;但是業務量不大的情況下,使用微服務到增加了複雜性及技術成本。明白技術的起源,針對不同的業務量,採取適當的架構、以最恰當的方式承載業務,是架構師必須具備的能力。 2.常見概念解讀: a.關係型資料庫通常具有ACID特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)。 b.Base(basically available, soft state, eventually consistent):一種 Acid 的替代方案,BASE 的可用性是通過支援區域性故障而不是系統全域性故障來實現的。化學理論中ACID是酸、Base恰好是鹼。 c.CAP定律:在分散式系統中,同時滿足"CAP定律"中的"一致性"、"可用性"和"分割槽容錯性"三者是不可能的。
d.強一致:當更新操作完成之後,任何多個後續程序或者執行緒的訪問都會返回最新的更新過的值。這種是對使用者最友好的,就是使用者上一次寫什麼,下一次就保證能讀到什麼。根據 CAP 理論,這種實現需要犧牲可用性,常見的RDBMS。 e.弱一致性:系統並不保證續程序或者執行緒的訪問都會返回最新的更新過的值。系統在資料寫入成功之後,不承諾立即可以讀到最新寫入的值,也不會具體的承諾多久之後可以讀到。 f.最終一致性:弱一致性的特定形式。系統保證在沒有後續更新的前提下,系統最終返回上一次更新操作的值。在沒有故障發生的前提下,不一致視窗的時間主要受通訊延遲,系統負載和複製副本的個數影響。DNS 是一個典型的最終一致性系統。 為保證可用性,網際網路分散式架構將強一致性需求
轉換成最終一致性的需求,並通過系統執行冪等性的保證,保證資料的最終一致性。 冪等性(Idempotence):分散式架構的基石,即同一個操作無論請求多少次,其結果都相同。 典型的是HTTP,Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. 每個概念實際所解決的是人遇到的某個特定的問題,發現其背後所代表的問題,是理解高併發分散式架構、分散式系統資料一致性第二步。 3.Most Simple原理解讀 假設有一個從賬戶取錢的遠端API(可以是HTTP的,也可以不是),我們暫時用類函式的方式記為:

bool withdraw(account_id, amount)
withdraw的語義是從account_id對應的賬戶中扣除amount數額的錢;如果扣除成功則返回true,賬戶餘額減少amount;如果扣除失敗則返回false,賬戶餘額不變。 值得注意的是:和本地環境相比,我們不能輕易假設環境的可靠性
。 一種典型的場景是withdraw請求已經被伺服器端正確處理,但伺服器端的返回結果由於網路等原因被掉丟了,導致客戶端無法得知處理結果。如果是在網頁上,一些不恰當的設計可能會使使用者認為上一次操作失敗了,然後重新整理頁面,這就導致了withdraw被呼叫兩次,賬戶也被多扣了一次錢。如圖1所示:

non-idempotent

一種更輕量級的解決方案是冪等設計。我們可以通過一些技巧把withdraw變成冪等的,比如:
int create_ticket() 
bool idempotent_withdraw(ticket_id, account_id, amount)
create_ticket的語義是獲取一個伺服器端生成的唯一的處理號ticket_id,它將用於標識後續的操作。idempotent_withdraw和withdraw的區別在於關聯了一個ticket_id,一個ticket_id表示的操作至多隻會被處理一次,每次呼叫都將返回第一次呼叫時的處理結果。這樣,idempotent_withdraw就符合冪等性了,客戶端就可以放心地多次呼叫。

基於冪等性的解決方案中一個完整的取錢流程被分解成了兩個步驟:1.呼叫create_ticket()獲取ticket_id;2.呼叫idempotent_withdraw(ticket_id, account_id, amount)。雖然create_ticket不是冪等的,但在這種設計下,它對系統狀態的影響可以忽略,加上idempotent_withdraw是冪等的,所以任何一步由於網路等原因失敗或超時,客戶端都可以重試,直到獲得結果。如圖所示:

idempotent

和分散式事務相比,冪等設計的優勢在於它的輕量級,容易適應異構環境,以及效能和可用性方面。在某些效能要求比較高的應用,冪等設計往往是唯一的選擇。 冪等性是高併發分散式架構、分散式系統資料一致性的底層基本原理,理解這一步,是走上"成金之路"的關鍵。 4.案例分析 a.eBay經典的BASE模式 一個最常見的場景,如果產生了一筆交易,需要在交易表增加記錄,同時還要修改使用者表的金額。這兩個表屬於不同的庫及遠端服務,所以就涉及到分散式事務一致性的問題。 核心思想是用兩個事務來保證一致性,同時用非同步保證了可用性:一個事務處理主要操作"增加交易表記錄"與非同步訊息構建,另外一個事務用來處理構建的非同步訊息;第一個事務即處理主要業務又記錄次要業務,同時還能快速返回,保證了高可用性,第二個事務則用來保證資料的一致性。(即將buyer和seller表更新的處理轉為"線下"處理,訊息日誌可以儲存到本地文字、資料庫或訊息佇列,再通過業務規則自動或人工發起重試。人工重試更多的是應用於支付場景,通過對賬系統對事後問題的處理,類似與淘寶雙11重複支付後續退款) 一個經典的解決方法,將主要修改操作以及更新使用者表的"非同步訊息"放在一個本地事務來完成。同時為了達到多次重試的冪等性,避免重複消費使用者表訊息帶來的問題,增加一個更新記錄表 updates_applied 來記錄已經處理過的訊息。 在第一事務中,通過本地的資料庫的事務保障,保證"增加交易表記錄"、"增加兩條非同步訊息佇列記錄(一條處理buyer表、一條處理seller表)",同時成功或同時失敗。 在第二事務中,分別讀出訊息佇列(但不刪除),通過判斷更新記錄表 updates_applied 來檢測相關訊息是否被執行,如沒執行,則執行相關業務邏輯(保證冪等性,保證即使執行過程中異常,重複執行沒有任何問題),執行完所有訊息後然後增加一條操作記錄到updates_applied,事務到此結束。用事務保證兩個非同步訊息執行及updates_applied的一致性操作(又稱為分散式事務框架)。最後刪除佇列。 b.去哪兒網分散式事務方案 i.優先使用非同步方案,原理和"a.eBay經典的BASE模式"類似,對業務邏輯處理不能保證"冪等性"的,增加去重表(即a中的updates_applied) 來處理 ii.對於不適合非同步訊息處理的業務,如A、B、C三方需要同步處理才能返回:在A、B、C三個庫中分別維護一個事務記錄表recorda/recordb/recordc,當A、B、C業務事務處理完,將結果存到對應的recordx中,由一箇中心服務對比查詢三方的事物記錄表,有如下兩種處理方式:     第一種:A、B成功,C失敗了,重試C,知道C成功;     第二種:C不可能成功時,回滾A、B,如C為扣庫存,當庫存為0時,則不能成功(不考慮補庫存)。 另,這種recordx表由RPC框架層進行維護,對業務是透明的。 c.蘑菇街交易建立過程 場景:將下單功能拆分為12個子業務(見參考資料b),對於非實時、非強一致性的關聯業務,使用"eBay經典的BASE模式"思想,第一個本地事務執行成功後,以發訊息通知、關聯事務非同步化執行方案,來避免a中第二個事務的"分散式事務框架"對業務帶來的侵入和複雜性,具體方案是基於DB事件變化通知給MQ,而MQ消費者通過ACK,保證訊息一定消費成功,完成強一致性(訊息可能會被重發,所以訊息消費方要保證冪等性)。 而對要求同步做、強一致性要求的場景(和b的ii相同場景),如優惠券和優惠券減庫存:可以引入"a.eBay經典的BASE模式"的第二個事務(分散式事務框架)來處理,但是複雜性會急劇上升; 另一種方式是建立一個不可見訂單,然後在同步呼叫鎖券和扣減庫存時,針對呼叫異常(失敗或者超時),發出廢單訊息到MQ。如果訊息傳送失敗,本地會做時間階梯式的非同步重試;優惠券系統和庫存系統收到訊息後,會進行判斷是否需要做業務回滾,這樣就準實時地保證了多個本地事務的最終一致性。 根據業務進行不同的方案處理,解決了高併發分散式架構、分散式系統的資料一致性問題。   整體來說,蘑菇街的案例可遷移性強,可移植性好,可以嘗試模擬下實際場景,駕馭分散式架構、分散式系統資料一致性方案,祝大家早日走上"成金之路",看到這裡,煩請不吝"推薦",謝謝! 5.參考資料:

相關推薦

這些併發分散式架構分散式系統資料一致性解決方案如何找到高新網際網路工作強勢解析eBay BASE模式哪兒蘑菇分散式架構

網際網路行業是大勢所趨,從招聘工資水平即可看出,那麼如何提升自我技能,滿足網際網路行業技能要求?需要以目標為導向,進行技能提升,本文主要針對高併發分散式系統設計、架構(資料一致性)做了分析,祝各位早日走上屬於自己的"成金之路"。 目錄:問題分析概念解讀Most Simple原理解讀eBey、去哪兒、蘑菇街分

併發優化實踐】10倍請求壓力來襲系統會被擊垮嗎?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! “ 上篇文章 一次 JVM FullGC的背後,竟隱藏著驚心動魄的線上生產事故!,給大家講了一個線上系統因為JVM FullGC異常宕機的case。 這篇文章,我們繼續給大家聊聊另

訊息中介軟體(一)分散式系統事務一致性解決方案大對比誰最好使?(轉)

原文轉載至:https://blog.csdn.net/lovesomnus/article/details/51785108   在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,

Redis併發可能產生的問題即個人見解解決方案

1、  如果redis宕機了,或者連結不上,怎麼辦?解決方法:    ①配置主從複製,配置哨兵模式(相當於古代門派的長老級別可以選擇掌門人的權利),一旦發現主機宕機,讓下一個從機當做主機。    ②如果最壞的情況,只能關閉Redis連線,去往資料庫連線。但由於資料量大,這樣S

訊息中介軟體(一)分散式系統事務一致性解決方案大對比誰最好使?

在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,

併發的業務場景如何做到資料一致性的。

一、場景: 1、有資料表:ConCurrency, CREATE TABLE [dbo].[ConCurrency]( [ID] [int] NOT NULL, [Total] [int] NULL ) 2、初始值:ID=1,Total = 0

分散式系統事務一致性解決方案

開篇 在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,系統往往是以單體應用形式存在的,也沒有橫跨多個數據庫。我們通常只需藉助開發平臺中特有資料訪問技術和框架(例如Spring、JD

最常用的分散式ID解決方案知道幾個

# 一、分散式ID概念 說起ID,特性就是唯一,在人的世界裡,ID就是身份證,是每個人的唯一的身份標識。在複雜的分散式系統中,往往也需要對大量的資料和訊息進行唯一標識。舉個例子,資料庫的ID欄位在單體的情況下可以使用自增來作為ID,但是對資料分庫分表後一定需要一個唯一的ID來標識一條資料,這個ID就是分散式I

分散式事務瞭解嗎?你們的多個服務間資料一致性解決方案是什麼?

## 前言 看標題就知道,這個又是個在面試中被問到的問題。這個問題其實是在我上次換工作的時候面試被問到過幾次,之前也沒在意過,覺得這個東西可能比較深奧,我直接說不理解吧。但是隨著Java開發這個行業越來越卷,這次換工作一定要做好充足的準備。把之前落下的坑都填好,再出去受虐(面試)。 ## 什麼是分散式事務 我

穆迪分析與普華永道合作提供“端到端”的精算會計和業務專業解決方案以協助保險公司實現IFRS 17的合規

倫敦 -- (美國商業資訊) -- 穆迪分析與普華永道今日宣佈,雙方將合作向市場提供一流的技術、實施和諮詢解決方案,以在全球範圍內協助保險公司應對《國際財務報告準則第17號: 保險合同》(IFRS17)。 普華永道全球保險業IFRS 17部門的主管Alex Bertolotti表示:“保險公

memcacheredis等常用nosql解決方案優缺點以及使用場景

作者:郭無心 連結:http://www.zhihu.com/question/19829601/answer/88069207 來源:知乎 著作權歸作者所有,轉載請聯絡作者獲得授權。1. MySql+Memcached架構的問題   實際MySQL是適合進行海量資料儲存的,通過Memcached將熱點資料載

大流量併發的網站的底層系統架構

動態應用,是相對於網站靜態內容而言, 是指以c/c++、php、Java、perl、.net等 伺服器端語言開發的網路應用軟體,比如論壇、網路相簿、交友、BLOG等常見應用。動態應用系統通 常與資料庫系統、快取系統、分散式儲存系統等密不可分。 大型動態應用系統平臺主要是針對於大流 量、高併發網站建立的

這些要點敢說精通PHP?

如果想進入大的企業進行底層開發的話必須對網際網路各方面的技術原理了解的很清楚,例如apache實現原理。語言方面既然是php開發自然對 c/c++要求比較高。往往需要自己寫php擴充套件。使用mysql自然想很多常見的,效能瓶頸要能有很好的解決方案。mysql 外掛編寫,apache模組編寫。聯絡起

作為一個java開發者這些框架?

1.通過消除學習多個臨時收集API的需要,減少了學習API所需的工作量。 2.通過提供有用的資料結構和演算法來減少程式設計工作量,因此您不必親自編寫它們。 3.通過為集合和演算法提供標準介面來操縱它們,促進軟體重用。 4.通過消除生成臨時集合API的需求,減少設計和實現API所需的工作量

如何打造一個高效能併發的訊息推送系統

前言 女友常常勉勵我:“要有共享、開放、開源的現代網際網路思維,自己的經驗要多總結,發到部落格論壇上什麼的。”之前也有腦洞開啟,想分享一些個人在工作之中、工作之外的所思所得,可始終不能持久。這次想把本次參與開發的專案記錄、分享出來,希望能持之以恆。 part 1 即時通訊與訊息推送

程式設計師是如何炫富的?敲5年程式碼還真聽這些“黑話”

要說現在什麼工作掙錢多,程式設計師絕對排的上號,沾了網際網路大踏步發展的光,敲程式碼成了一份令人羨慕的“高薪”職業,但身邊的朋友總是奇怪,為什麼很多程式設計師的打扮都有點“寒酸”,他們總有一種把月薪五萬過成月薪500的技能,。在其他行業的人眼裡,工資高首先就要體現在衣食住行方面,穿名牌、戴名錶、開豪

分散式服務化系統一致性分散式事務ACIDBASECAP)原理與解決方案

1、背景  一致性是一個抽象的、具有多重含義的計算機術語,在不同應用場景下,有不同的定義和含義。在傳統的IT時代,一致性通常指強一致性,強一致性通常體現在你中有我、我中有你、渾然一體;而在網際網路時代,一致性的含義遠遠超出了它原有的含義,在我們討論網際網路時代

如果讓自評一下成為一個好的架構師嗎

徹底 組織結構 模型 code 沒有 要求 大型 trac 地方 架構師,這個title就和總監之類的title一樣,已經徹底被用爛了,但在一個軟件產品的生命周期中,架構師是實實在在的一個極度重要的角色,這篇文章就來講講我覺得的架構師的畫像,到底具備什麽素質的同學是貼合架構

MySQL 在併發下的 訂單撮合 系統使用 共享鎖 與 排他鎖 保證資料一致性

作者:林冠巨集 / 指尖下的幽靈 掘金:juejin.im/user/587f0d… 部落格:www.cnblogs.com/linguanh/ GitHub : github.com/af913337456… 騰訊雲專欄: cloud.tencent.c

3G4G5G有何不同之處真的嗎?

  3G、4G、5G有何不同之處,你真的懂嗎? 3G技術還未遠去,4G技術方興未艾,5G技術已蓄勢待發。本文從技術層面全面解析了關於3G、4G、5G的不同之處:1.無線通訊傳遞媒介:電磁波,2.無線通訊傳遞通道:頻寬,3.頻寬與資料傳輸率的差異,4.數字調變技術,5.多工技術,6.