高並發庫存秒殺場景,阿里巴巴資料庫是這樣應對的

2020-12-13 阿里云云棲號

簡單庫存場景的資料庫實現

一般來說,從資料庫層面講,庫存業務會分為兩步,第一步是插入一條記錄到扣減明細表inventory_detail,第二步是對庫存扣減表inventory的一條記錄進行扣減,這兩步往往是在一個事務中實現的。

資料庫業務架構圖如下,所有的請求均發往同一個Database。

從上文的架構圖不難看出,所有的商品的庫存信息都存在單一的表和庫裡,當商品種類繁多或者業務並發請求暴漲時,單實例的資料庫顯然會成為容量或者性能瓶頸。該資料庫架構一般只是功能性的實現,主要用於微型庫存系統或者測試使用。

高並發庫存系統的資料庫實現

為了解決單實例存在的容量和性能上限問題,阿里巴巴所有的庫存系統在十年前就實現了分庫分表設計,主要通過數據的水平拆分實現不同商品的庫存扣減請求路由到不同的資料庫。基本資料庫架構圖如下

從上圖不難看出,庫存扣減表和扣減明細表一般都使用商品id作為片鍵,這樣可以保證滿足整個系統在高並發扣減請求的同時,同一商品的庫存扣減操作和添加明細操作在同一個事務中實現。如果數據分布和業務請求足夠均勻,理論上經過分庫分表設計後,整個系統的吞吐量將會是線性的增長,主要取決於分實例的數量。

熱點行更新

在電商業務中,商家活動比如秒殺不可避免。秒殺活動會給電商庫存系統帶來巨大的挑戰,尤其體現在資料庫層面。因為往往一個商品id對應於資料庫的一行記錄,所以在DB架構上按照商品維度做了分庫分表也是無效的。而更新這行記錄時必然需要給這行記錄加X鎖。熱點商品的庫存扣減本質上就是熱點行更新的能力,高並發的同行更新會造成嚴重的行鎖等待現象,從而導致資料庫的threads_running和rt飆升,造成雪崩。在當前的官方mysql中,一般單行更新的QPS在500以內,對於熱點商品的秒殺需求,這個量往往是不達標的。

阿里巴巴PolarDB-X資料庫團隊基於以上場景的需求,針對內核優化,引入了先進的水車模型,在識別出熱點SQL後,實現了在內核層面優化處理,相比官方MySQL提高了10倍以上的熱點行扣減能力,廣泛應用於集團電商庫存集群,資金平臺,權益發放平臺等核心資料庫集群。

其主要的核心思想是:針對應用層SQL做輕量化改造,帶上"熱點行SQL"的標籤,當這種SQL進入內核後,在內存中維護一個hash表,將主鍵或唯一鍵相同的請求(一般也就是同一商品id)hash到同一個地方做請求的合併,經過一段時間後(默認100us)統一提交,從而實現了將串行處理變成了批處理,讓每個熱點行更新請求並不需要都去掃描和更新btree。

類似原理,阿里雲RDS資料庫團隊同樣在內核層面針對熱點行更新做了大量的優化,核心思路為引入SQL語句的排隊機制,將可能存在行鎖衝突的語句放在一個組內排序,從而減少行鎖衝突帶來的額外系統開銷。Statement Queque和Inventory Hint可以結合使用,不過在事務中,熱點行更新必須是該事務的最後一條記錄,因為commit on success的機制存在,一旦該SQL執行成功就會自動提交或自動回滾。簡單的使用範例如下

begin;insert into inventory_detail(inventory_id,user_id) values(1,1);update /*+ ccl_queue_value(1) commit_on_success rollback_on_fail target_affect_row(1) */ inventory set inventory_count=inventory_count+1 where inventory_id=1

更多文檔參考inventory hint statement queue

業務架構優化

冪等性實現

在庫存資料庫系統中,一般都會在更新庫存記錄後,寫入一條庫存扣減明細的流水記錄,用於後續可能存在的查詢需求。舉個例子,在集團的權益發放平臺中,庫存流水記錄主要用於實現庫存扣減的冪等性,即同一個用戶只能領取一次權益。在系統的實際運行過程中,可能因為一些網絡故障等其他原因,當底層資料庫的扣減成功以後並沒有成功返回給用戶時,用戶可能會有重試操作,這時就必須避免庫存記錄的重複扣減情況。所以針對這些情況,應用在設計時會考慮先查詢一遍庫存流水記錄,如果該用戶已經領取過該權益,則不再重複扣減,直接返回。為了實現這種強冪等性的需求,庫存扣減和插入流水就必須在同一個事務中,滿足同時成功或同時失敗。

基於緩存的分桶扣減方案

在更大規模,針對單一商品的超高並發扣減的庫存集群中,可能基於資料庫內核的改造優化還無法滿足業務需求。單一商品的超高並發扣減可能會影響到同一資料庫實例上的其他商品扣減,同一個資料庫實例上也可能存在多個熱點商品造成互相影響,這時就需要考慮在業務和資料庫架構上再做一次升級,我們引入基於緩存的分桶扣減方案。

下圖為該方案資料庫架構圖,基於緩存的分桶扣減方案的主要思路為

1、普通的非熱點商品,或者並發度不夠大的熱點商品走強冪等性的分庫分表+資料庫內核改造優化2、超大熱點商品,針對該商品再做多key拆分,先走弱冪等性的緩存扣減,緩存扣減後,異步往DB寫入一條庫存流水記錄,後續再做緩存與資料庫的庫存總量同步

在分桶方案詳細落地實現上,需要考慮的細節問題會多很多,比較重要的有以下幾點

1、分桶管理

為了更通俗和直觀的描述,緩存集群的一個key就對應于于一個"分桶"。要實現一個基於緩存分桶方案的高擴展性的庫存系統,分桶的設計至關重要,比如一個熱點商品應該對應多少個分桶,分桶的數量能否根據當前的業務變化做到彈性的伸縮

1、分桶預分配庫存:當分桶初始化後,每個分桶應該保存多少庫存量。不一定在預分配庫存階段將該商品的庫存數量從DB全部分配到緩存中,可能是一種漸進式的分配策略,DB作為庫存總池子2、分桶擴容/縮容:分桶數量的變化,擴縮容操作本質上是調整桶映射管理內的信息,加入或者減少桶,桶信息一旦增加或者減少了,扣減鏈路會秒級感知到,然後將用戶流量引導或者移除出去。從上面的DB架構圖可以看出,比較簡單的實現方式就是根據當前熱點商品的桶數量取模3、桶內庫存數量擴容/縮容:即每個分桶內該商品的庫存數量變化,擴容場景主要用於當該分桶內庫存接近扣減完成時,系統自動去MySQL庫存集群總池子裡撈一部分過來放進桶內。縮容場景主要場景在於桶下線後將桶內剩餘的庫存回收到庫存總池子中4、合併展示:在基於緩存的分桶設計中,由於同一種熱點商品拆分成了多個key,所以在前端界面展示上同樣會帶來挑戰,需要做庫存的合併2、超賣問題

一個較為簡單的處理超賣問題的思路是預留一部分庫存,當庫存數量低於之前定義的預留值時,直接返回前端庫存扣減完畢,從而避免造成超賣。

3、碎片問題

在一些類庫存系統的設計中,考慮到系統的兼容性和支持的扣減種類,或許扣減的是商品的庫存數量,或許是紅包的金額(將帶小數的紅包金額轉換成整型數扣減)。所謂碎片問題,舉個例子,假如扣減的是紅包金額,假設紅包金額至少要發1塊錢,換算成整型數也就是100,在多個分桶扣減的情況下,最後部分分桶的剩餘庫存值可能低於100,而所有分桶加起來的總額又大於100。如果不做處理,就會造成資損。

應對這種極端場景,系統需要在檢測到存在碎片時,自動將存在碎片的分桶下線納入庫存總池子,由DB總池子再分出少量的緩存key來進行扣減,多次循環直到不存在碎片為止。或者針對出現這種情況後,由於庫存總量已經基本扣減完畢,在納入DB總池子後直接在DB側扣減。

相關焦點

  • 高並發解決方案之秒殺
    一、什麼是高並發高並發(High Concurrency)是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。並發用戶數:同時承載正常使用系統功能的用戶數量。例如一個即時通訊系統,同時在線量一定程度上代表了系統 的並發用戶數。二、什麼是秒殺秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。
  • 「高並發」Redis如何助力高並發秒殺系統,看完這篇我徹底懂了!
    秒殺業務在電商領域,存在著典型的秒殺業務場景,那何謂秒殺場景呢。簡單的來說就是一件商品的購買人數遠遠大於這件商品的庫存,而且這件商品在很短的時間內就會被搶購一空。比如每年的618、雙11大促,小米新品促銷等業務場景,就是典型的秒殺業務場景。
  • 詳解:如何設計出健壯的秒殺系統?
    1.6:大量請求問題按照1.2的考慮,就算使用緩存還是不足以應對短時間的高並發的流量的衝擊。如何承載這樣巨大的訪問量,同時提供穩定低時延的服務保證,是需要面對的一大挑戰。二:秒殺系統的設計和技術方案2.1:秒殺系統資料庫設計針對1.5提出的秒殺資料庫的問題,因此應該單獨設計一個秒殺資料庫,防止因為秒殺活動的高並發訪問拖垮整個網站。這裡只需要兩張表,一張是秒殺訂單表,一張是秒殺貨品表
  • 營銷中臺建設篇(三):庫存中心,讓貨物流動起來
    各方業務對庫存的高度關聯催生「高內聚低耦合」庫存中心服務能力,統一對外提供服務,避免「煙囪式」IT系統架構。業務顧名思義,庫存中心即管理商品在倉庫的庫存數據,再往上抽象一層可分為倉庫庫存和店鋪庫存:n 店鋪庫存:亦可稱為前臺庫存,也就是面向用戶緯度的庫存數量;n 倉庫庫存:亦可稱為後臺庫存,就是面向倉庫緯度的庫存數量。
  • redis如何解決高並發問題?避免出現超賣的情況?
    相信你要處理高並發問題,肯定會想到使用redis緩存資料庫。因為它可以在一定程度上解決網站一瞬間的並發量,不會出現卡死的情況,因為他是使用了內存的,如果你使用普通的資料庫的話,增加伺服器的壓力,效率低下不說,更有可能高並發的時候導致壞表了,也有可能直接導致伺服器假死。也就是卡著了,一點反應都沒有。這可是致命的問題啊。
  • 阿里P9耗時28天,總結歷年億級活動高並發系統設計手冊
    當然不同量級的系統也會有不同的問題,畢竟誰都不是淘寶,對吧,同樣的,針對不同的需求以及業務場景,也就會有對架構設計的不同需求。如果沒有這些的支持,想一下,雙十一的那一刻,你會不會氣憤到摔手機!同樣的,高並發系統的演進也不是一步到位的,也是循序漸進,不斷改進的,像幾年前,雙十一卡崩,無法付款無法選擇地址的事情每年都會發生,但是今年的情況是不是好一些呢?
  • 如何設計電商行業億級用戶秒殺系統
    秒殺開始前幾分鐘,大量用戶開始進入秒殺商品詳情頁面,很多人開始頻繁刷新秒殺商品詳情頁,這時秒殺商品詳情頁訪問量會猛增。秒殺開始,大量用戶開始搶購,這時創建訂單,扣庫存壓力會顯著增大。實際上,秒殺場景基本都是秒殺參與人多,秒殺成功的人卻寥寥無幾,經常是幾十萬人或者更多人搶幾百個商品庫存。那麼我們曾經是怎麼設計秒殺系統的呢?
  • OceanBase資料庫性能優勢應用場景及收費標準
    OceanBase資料庫是阿里巴巴和螞蟻金服100%自主研發的金融級分布式關係資料庫,在普通硬體上實現金融級高可用,OceanBase具備在線水平擴展能力,創造了6100萬次/秒處理峰值的業內紀錄,資料庫吧(shujukuba.com)關於OceanBase版收費標準性能優勢、功能及應用場景詳細說明:
  • 阿里雲全面布局雲原生資料庫產品體系,點亮企業數據上雲之路
    【天極網IT新聞頻道】9月18日雲棲大會,阿里雲智能資料庫產品事業部負責人、達摩院資料庫與存儲實驗室負責人、阿里巴巴集團副總裁李飛飛正式推出雲原生分布式資料庫PolarDB-X、雲原生數據倉庫AnalyticDB、雲原生數據湖分析Data Lake Analytics(DLA)、雲原生多模資料庫Lindorm等多款產品的發布與升級。
  • 巨杉資料庫 王濤:如何打造金融級資料庫
    資料庫作為基礎工具型軟體,要滿足各種系統需求,而不為單一特定的場景服務。做到這點的核心就是「原廠」掌握核心代碼,掌控產品路線,能夠快速應對客戶需求的同時也能保證產品化。我們都知道,細節定成敗,實踐出真知,技術實力的背後是產品能力。一個成熟的產品需要不斷的在大規模的金融級應用中實踐與礪煉。這個過程就是不斷爬坑、不斷積累經驗和不斷完善細節。
  • 進入雲原生、分布式的時代,什麼才是資料庫的正確打開方式
    據統計,今年雙十一交易峰值是每秒58.3萬筆,每筆訂單背後包括商品、交易、支付、物流、評價等複雜的業務邏輯,,對於資料庫來講就變成了上億甚至更高的每秒事務處理能力。不過對於坐在電腦前的消費者來說,儘管瞬間產生了如此大規模的高並發流量,但選款、下單、付款的購物流程,仍然是一氣呵成,「如絲般潤滑」。
  • RabbitMQ 簡介以及使用場景
    AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。二. RabbitMQ 使用場景### 1. 解耦(為面向服務的架構(SOA)提供基本的最終一致性實現)場景說明:用戶下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的接口。
  • SequoiaDB 巨杉資料庫 v3.4 版本正式發布 分布式交易場景性能...
    進入深秋,北風一遍一遍地吹,隨著大家陸陸續續穿上了秋褲,SequoiaDB 巨杉資料庫在深秋給大家帶來了「一把火」。SequoiaDB v3.4 於近期正式發布啦!分布式交易場景性能大幅提升SequoiaDB 巨杉資料庫 3.4版本正式發布,SequoiaDB v3.4最重要的特性就是在分布式交易場景下的性能提升。
  • 1號店11.11:從應用架構落地點談高可用高並發高性能
    1.背景 1.1三高是電商核心交易系統的基礎電商核心交易系統有很多特點,如分布式、高可擴展等,在眾多特性中,高可用、高並發、高性能是基礎。大到技術峰會、論壇、研討會,小到一場面試,高可用、高並發、高性能始終是焦點,是技術大牛、技術追隨者永遠津津樂道的話題,成為他們畢生的追求。
  • 通過加鎖控制Oracle資料庫並發事務
    在Oracle資料庫中要處理並發的話,可以通過加鎖,和設置只讀事務,以及設置隔離級別來控制處理並發。今天主要介紹的是通過加鎖來控制並發事務。在並發控制中,Oracle 主要利用了事務的特性和鎖的機制。鎖可以防止用戶訪問同一數據是相互幹擾,而事務之間存在著不同級別的隔離作用。
  • Java 資料庫設計 性能優化 電商秒殺系統附帶源碼
    課程名稱: JAVA 資料庫設計 性能優化 電商秒殺系統附帶源碼課程簡介: Java 資料庫設計 性能優化 電商秒殺系統附帶源碼----------------------課程目錄----------------------------
  • RadonDB 再度亮相 3306π 分享區塊鏈場景分布式資料庫實戰
    在分享中,張雁飛首先指出,區塊鏈信息世界與傳統的資料庫信息是相互割裂的。同時,區塊數據還具備數據量龐大、數據野蠻式增長、區塊數據涵蓋所有交易、以日誌方式記錄、極難檢索以及模型複雜等幾個特點。張雁飛指出,要應對這幾個特性,做到對區塊數據的有效管理,就需要 RadonDB 這樣的分布式關係型資料庫提供的一系列能力。
  • 對話阿里達摩院李飛飛:3次涅槃,阿里資料庫的自研路
    這一階段持續到2011年-2012年,彼時電商業務高速發展,對傳統的甲骨文企業級資料庫的解決方案提出很多挑戰,最明顯的挑戰是成本太高,當高並發網際網路電商發展到巨大的規模,那個成本將是天文數字。第二階段,雙十一誕生後,阿里開始大規模使用開源資料庫。
  • 國產資料庫專題報告:黃金賽道龍頭,十倍成長空間
    NoSQL 有如下優點:易擴展,NoSQL 資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性。數據之間無關係,這樣就非常容易擴展。無形之間也在架構的層面上帶來了可擴展的能力。大數據量,高性能,NoSQL 資料庫都具有非常高的讀寫性能,尤其在大數據量下,同樣表現優秀。這得益於它的無關係性,資料庫的結構簡單。