日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

如何设计一个小而美的秒杀系统?

發(fā)布時間:2025/4/5 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何设计一个小而美的秒杀系统? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://www.ibm.com/developerworks/cn/web/wa-design-small-and-good-kill-system/index.html

現(xiàn)如今,春節(jié)搶紅包的活動已經(jīng)逐漸變成大家過年的新風(fēng)俗。親朋好友的相互饋贈,微信、微博、支付寶等各大平臺種類繁多的紅包讓大家收到手軟。雞年春節(jié),公司的老總們也想給 15 萬的全國員工發(fā)福利,于是我們構(gòu)建了一套旨在支撐 10 萬每秒請求峰值的搶紅包系統(tǒng)。經(jīng)實踐證明,春節(jié)期間我們成功的為所有的小伙伴提供了高可靠的服務(wù),紅包總發(fā)放量近百萬,搶紅包的峰值流量達到 3 萬/秒,最快的一輪搶紅包活動 3 秒鐘所有紅包全部搶完,系統(tǒng)運行零故障。

紅包系統(tǒng)面臨的挑戰(zhàn)

紅包系統(tǒng),類似于電商平臺的秒殺系統(tǒng),本質(zhì)上都是在一個很短的時間內(nèi)面對巨大的請求流量,將有限的庫存商品分發(fā)出去,并完成交易操作。比如 12306 搶票,庫存的火車票是有限的,但瞬時的流量非常大,且都是在請求相同的資源,這里面數(shù)據(jù)庫的并發(fā)讀寫沖突以及資源的鎖請求沖突非常嚴重。現(xiàn)在,我們將分析實現(xiàn)這樣一個紅包系統(tǒng),需要面臨如下的一些挑戰(zhàn):

首先,到活動整點時刻,我們有 15 萬員工同時涌入系統(tǒng)搶某輪紅包,瞬間的流量是很大的,而目前我們整個鏈路上的系統(tǒng)和服務(wù)基礎(chǔ)設(shè)施,都沒有承受過如此高的吞吐量,要在短時間內(nèi)實現(xiàn)業(yè)務(wù)需求,在技術(shù)上的風(fēng)險較大。

其次,公司是第一次開展這樣的活動,我們很難預(yù)知大家參與活動的情況,極端情況下可能會出現(xiàn)某輪紅包沒搶完,需要合并到下輪接著發(fā)放。這就要求系統(tǒng)有一個動態(tài)的紅包發(fā)放策略和預(yù)算控制,其中涉及到的動態(tài)計算會是個較大的問題(這也是為系統(tǒng)高吞吐服務(wù)),實際的系統(tǒng)實現(xiàn)中我們采用了一些預(yù)處理機制。

最后,這個系統(tǒng)是為了春節(jié)的慶祝活動而研發(fā)的定制系統(tǒng),且只上線運行一次,這意味著我們無法積累經(jīng)驗去對服務(wù)做持續(xù)的優(yōu)化。并且相關(guān)的配套環(huán)境沒有經(jīng)過實際運行檢驗,缺少參考指標,系統(tǒng)的薄弱環(huán)節(jié)發(fā)現(xiàn)的難度大。所以必須要追求設(shè)計至簡,盡量減少對環(huán)境的依賴(數(shù)據(jù)路徑越長,出問題的環(huán)節(jié)越多),并且實現(xiàn)高可伸縮性,需要盡一切努力保證可靠性,即使有某環(huán)節(jié)失誤,系統(tǒng)依然能夠保障核心的用戶體驗正常。

能負責(zé)有技術(shù)挑戰(zhàn)的項目,對于工程師來說總是壓力和興趣并存的。接手項目后一個月的時間內(nèi)我們完成了技術(shù)調(diào)研,原型設(shè)計研發(fā),線上運維等工作。關(guān)于這個過程中的細節(jié),下面為讀者一一道來。

系統(tǒng)設(shè)計

系統(tǒng)架構(gòu)圖如圖 1 所示。整個系統(tǒng)的主干采用主流的 Web 后臺設(shè)計結(jié)構(gòu),子系統(tǒng)各自部署為集群模式并且獨立。APP 客戶端與網(wǎng)關(guān)接入層(負責(zé)用戶鑒權(quán)、流量負載均衡、整合數(shù)據(jù)緩存等)進行交互,再往后是核心的邏輯系統(tǒng)(用戶資格校驗、紅包分發(fā)、數(shù)據(jù)異步持久化、異步財務(wù)到賬、降級等),數(shù)據(jù)持久化采用的 MySQL 集群。除此之外還有靜態(tài)資源的管理(紅包頁面圖片、視頻等資源的訪問優(yōu)化)以及配套的服務(wù)整體運行監(jiān)控。所有的靜態(tài)資源提前部署在了第三方的 CDN 服務(wù)上。為了保障整體系統(tǒng)可靠性,我們做了包括數(shù)據(jù)預(yù)處理、水平分庫、多級緩存、精簡 RPC 調(diào)用、過載保護等多項設(shè)計優(yōu)化,并且在原生容器、MySQL 等服務(wù)基礎(chǔ)設(shè)施上針對特殊的業(yè)務(wù)場景做了優(yōu)化。

圖 1. 系統(tǒng)架構(gòu)

紅包本身的信息通過預(yù)處理資源接口獲取。運行中用戶和紅包的映射關(guān)系動態(tài)生成。底層使用內(nèi)部開發(fā)的 DB 中間件在 MySQL 數(shù)據(jù)庫集群上做紅包發(fā)放結(jié)果持久化,以供異步支付紅包金額到用戶賬戶使用。整個系統(tǒng)的絕大部分模塊都有性能和保活監(jiān)控。

優(yōu)化方案

優(yōu)化方案中最重要的目標是保障關(guān)鍵流程在應(yīng)對大量請求時能穩(wěn)定運行,做到這一點,需要很高的系統(tǒng)可用性。因此,業(yè)務(wù)流程和數(shù)據(jù)流程要盡量精簡,減少容易出錯的環(huán)節(jié)。此外,cache、DB、網(wǎng)絡(luò)、容器環(huán)境,任何一個部分都有可能會出現(xiàn)短時故障,我們需要提前做處理預(yù)案。針對以上的目標難點,我們總結(jié)了如下的實踐經(jīng)驗。

數(shù)據(jù)預(yù)處理

我們結(jié)合活動預(yù)案要求,將紅包本身的屬性信息(金額,狀態(tài),祝福語,發(fā)放策略),使用一定的算法提前生成好所有的信息,這些數(shù)據(jù)所占空間不是很大。為了最大化提升性能,我們事先將這些紅包數(shù)據(jù),我們事先存儲在數(shù)據(jù)庫中,然后在容器加載服務(wù)啟動時,直接加載到本地緩存中當作只讀數(shù)據(jù)。另外,我們將員工信息也做了一定的裁剪,最基本的信息也和紅包數(shù)據(jù)一樣,預(yù)先生成,服務(wù)啟動時加載。

此外,我們的活動頁面,有很多視頻和圖片資源,如果這么多的用戶從網(wǎng)關(guān)實時訪問,帶寬很可能直接就被這些大流量的請求占滿了,用戶體驗可想而知。最后這些靜態(tài)資源,我們都部署在了 CDN 上,通過數(shù)據(jù)預(yù)熱的方式加速客戶端的訪問速度,網(wǎng)關(guān)的流量主要是來自于搶紅包期間的小數(shù)據(jù)請求。

精簡 RPC 調(diào)用

服務(wù)請求流程通常是在接入層訪問用戶中心進行用戶鑒權(quán),然后轉(zhuǎn)發(fā)請求到后端服務(wù),后端服務(wù)根據(jù)業(yè)務(wù)邏輯調(diào)用其他上游服務(wù),并且查詢數(shù)據(jù)庫資源,再更新服務(wù)/數(shù)據(jù)庫的數(shù)據(jù)。每一次 RPC 調(diào)用都會有額外的開銷,所以,比如上面一點所說的預(yù)加載,使得每個節(jié)點在系統(tǒng)運行期間都有全量的查詢數(shù)據(jù)可在本地訪問。搶紅包的核心流程就被簡化為了生成紅包和人的映射關(guān)系,以及發(fā)放紅包的后續(xù)操作。再比如,我們采用了異步拉的方式進行紅包發(fā)放到賬,用戶搶紅包的請求不再經(jīng)過發(fā)放這一步,只記錄關(guān)系,性能得到進一步提升。 如圖 2 所示。

圖 2. 服務(wù)依賴精簡示意圖

實際上有些做法的可伸縮性是極強的。例如紅包數(shù)據(jù)的預(yù)生成信息,在當時的場景下是能夠作為本地內(nèi)存緩存加速訪問的。當紅包數(shù)據(jù)量很大的時候,在每個服務(wù)節(jié)點上使用本地數(shù)據(jù)庫、本地數(shù)據(jù)文件,甚至是本地 Redis/MC 緩存服務(wù),都是可以保證空間足夠的,并且還有額外的好處,越少的 RPC,服務(wù)抖動越少,我們只需要關(guān)注系統(tǒng)本身的健壯性即可,不需要考慮外部系統(tǒng) QoS。

搶紅包的并發(fā)請求處理

春節(jié)整點時刻,同一個紅包會被成千上萬的人同時請求,如何控制并發(fā)請求,確保紅包會且僅會被一個用戶搶到?

  • 做法一:使用加鎖操作先占有鎖資源,再占有紅包。

可以使用分布式全局鎖的方式(各種分布式鎖組件或者數(shù)據(jù)庫鎖),先申請 lock 該紅包資源且成功后再做后續(xù)操作。優(yōu)點是不會出現(xiàn)臟數(shù)據(jù)問題,某一個時刻只有一個應(yīng)用線程持有 lock,紅包只會被至多一個用戶搶到,數(shù)據(jù)一致性有保障。缺點是,所有請求同一時刻都在搶紅包 A,下一個時刻又都在搶紅包 B,并且只有一個搶成功,其他都失敗,效率很低。

  • 做法二:單獨開發(fā)請求排隊調(diào)度模塊。

排隊模塊接收用戶的搶紅包請求,以 FIFO 模式保存下來,調(diào)度模塊負責(zé) FIFO 隊列的動態(tài)調(diào)度,一旦有空閑資源,便從隊列頭部把用戶的訪問請求取出后交給真正提供服務(wù)的模塊處理。優(yōu)點是,具有中心節(jié)點的統(tǒng)一資源管理,對系統(tǒng)的可控性強,可深度定制。缺點是,所有請求流量都會有中心節(jié)點參與,效率必然會比分布式無中心系統(tǒng)低,并且,中心節(jié)點也很容易成為整個系統(tǒng)的性能瓶頸。

  • 做法三:巧用 Redis 特性,使其成為分布式序號生成器(我們最終采用的做法)。

前文已經(jīng)提到,紅包系統(tǒng)所使用的紅包數(shù)據(jù)都是預(yù)先生成好的,我們使用數(shù)字 ID 來標識,這個 ID 是全局唯一的,所有圍繞紅包的操作都使用這個 ID 作為數(shù)據(jù)的關(guān)聯(lián)項。在實際的請求流量過來時,我們采用了"分組"處理流量的方式,如下圖 3 所示。

訪問請求被負載均衡器分發(fā)到每個 Service Cluster 的分組 Bucket,一個分組 Bucket 包含若干臺應(yīng)用容器、獨立的數(shù)據(jù)庫和 Redis 節(jié)點。Redis 節(jié)點內(nèi)存儲的是這個分組可以分發(fā)的紅包 ID 號段,利用 Redis 特性實現(xiàn)紅包分發(fā),各服務(wù)節(jié)點通過 Redis 原語獲取當前 拆到的紅包。這種做法的思路是,Redis 本身是單進程工作模型,來自分布式系統(tǒng)各個節(jié)點的操作請求天然的被 Redis Server 做了一個同步隊列,只要每個請求執(zhí)行的足夠快,這個隊列就不會引起阻塞及請求超時。而本例中我們使用了 DECR 原語,性能上是可以滿足需求的。Redis 在這里相當于是充當一個分布式序號發(fā)生器的功能,分發(fā)紅包 ID。

此外,落地數(shù)據(jù)都持久化在獨立的數(shù)據(jù)庫中,相當于是做了水平分庫。某個分組內(nèi)處理的請求,只會訪問分組內(nèi)部的 Redis 和數(shù)據(jù)庫,和其他分組隔離開。

整個處理流程核心的思想是,分組的方式使得整個系統(tǒng)實現(xiàn)了高內(nèi)聚,低耦合的原則,能將數(shù)據(jù)流量分而治之,提升了系統(tǒng)的可伸縮性,當面臨更大流量的需求時,通過線性擴容的方法,即可應(yīng)對。并且當單個節(jié)點出現(xiàn)故障時,影響面能夠控制在單個分組內(nèi)部,系統(tǒng)也就具有了較好的隔離性。

圖 3. 系統(tǒng)部署邏輯視圖

系統(tǒng)容量評估,借助數(shù)據(jù)優(yōu)化,過載保護

由于是首次開展活動,我們?nèi)狈嶋H的運營數(shù)據(jù),一切都是摸著石頭過河。所以從項目伊始,我們便強調(diào)對系統(tǒng)各個層次的預(yù)估,既包括了活動參與人數(shù)、每個 APP 界面上的功能點潛在的高峰流量值、后端請求的峰值、緩存系統(tǒng)請求峰值和數(shù)據(jù)庫讀寫請求峰值等,還包括了整個業(yè)務(wù)流程和服務(wù)基礎(chǔ)設(shè)施中潛在的薄弱環(huán)節(jié)。后者的難度更大因為很難量化。此前我們連超大流量的全鏈路性能壓測工具都較缺乏,所以還是有很多實踐的困難的。

在這里內(nèi)心真誠的感謝開源社區(qū)的力量,在我們制定完系統(tǒng)的性能指標參考值后,借助如 wrk 等優(yōu)秀的開源工具,我們在有限的資源里實現(xiàn)了對整個系統(tǒng)的端到端全鏈路壓測。實測中,我們的核心接口在單個容器上可以達到 20,000 以上的 QPS,整個服務(wù)集群在 110,000 以上的 QPS 壓力下依然能穩(wěn)定工作。

正是一次次的全鏈路壓測參考指標,幫助我們了解了性能的基準,并以此做了代碼設(shè)計層面、容器層面、JVM 層面、MySQL 數(shù)據(jù)庫層面、緩存集群層面的種種優(yōu)化,極大的提升了系統(tǒng)的可用性。具體做法限于篇幅不在此贅述,有興趣的讀者歡迎交流。

此外,為了確保線上有超預(yù)估流量時系統(tǒng)穩(wěn)定,我們做了過載保護。超過性能上限閾值的流量,系統(tǒng)會快速返回特定的頁面結(jié)果,將此部分流量清理掉,保障已經(jīng)接受的有效流量可以正常處理。

完善監(jiān)控

系統(tǒng)在線上運行過程中,我們需要對運行情況實時獲取信息,以便能夠?qū)Τ霈F(xiàn)的問題進行排查定位,及時采取措施。所以我們必須有一套有效的監(jiān)控系統(tǒng),能夠幫我們觀測到關(guān)鍵的指標。在實際的操作層面,我們主要關(guān)注了如下指標:

  • 服務(wù)接口的性能指標

借助系統(tǒng)的請求日志,觀測服務(wù)接口的 QPS,接口的實時響應(yīng)總時間。同時通過 HTTP 的狀態(tài)碼觀測服務(wù)的語義層面的可用性。

  • 系統(tǒng)健康度

結(jié)合總的性能指標以及各個模塊應(yīng)用層的性能日志,包括模塊接口返回耗時,和應(yīng)用層日志的邏輯錯誤日志等,判斷系統(tǒng)的健康度。

  • 整體的網(wǎng)絡(luò)狀況

盡量觀測每個點到點之間的網(wǎng)絡(luò)狀態(tài),包括應(yīng)用服務(wù)器的網(wǎng)卡流量、Redis 節(jié)點、數(shù)據(jù)庫節(jié)點的流量,以及入口帶寬的占用情況。如果某條線路出現(xiàn)過高流量,便可及時采取擴容等措施緩解。

  • 服務(wù)基礎(chǔ)設(shè)施

應(yīng)用服務(wù)器的 CPU、Memory、磁盤 IO 狀況,緩存節(jié)點和數(shù)據(jù)庫的相應(yīng)的數(shù)據(jù),以及他們的連接數(shù)、連接時間、資源消耗檢測數(shù)據(jù),及時的去發(fā)現(xiàn)資源不足的預(yù)警信息。

對于關(guān)鍵的數(shù)據(jù)指標,在超過預(yù)估時制定的閾值時,還需要監(jiān)控系統(tǒng)能夠?qū)崟r的通過手機和郵件實時通知的方式讓相關(guān)人員知道。另外,我們在系統(tǒng)中還做了若干邏輯開關(guān),當某些資源出現(xiàn)問題并且自動降級和過載保護模塊失去效果時,我們可以根據(jù)狀況直接人工介入,在服務(wù)不停機的前提下,手動觸發(fā)邏輯開關(guān)改變系統(tǒng)邏輯,達到快速響應(yīng)故障,讓服務(wù)盡快恢復(fù)穩(wěn)定的目的。

服務(wù)降級

當服務(wù)器壓力劇增的時候,如果某些依賴的服務(wù)設(shè)施或者基礎(chǔ)組件超出了工作負荷能力,發(fā)生了故障,這時候極其需要根據(jù)當前的業(yè)務(wù)運行情況對系統(tǒng)服務(wù)進行有策略的降級運行措施,使得核心的業(yè)務(wù)流程能夠順利進行,并且減輕服務(wù)器資源的壓力,最好在壓力減小后還能自動恢復(fù)升級到原工作機制。

我們在開發(fā)紅包系統(tǒng)時,考慮到原有 IDC 機房的解決方案對于彈性擴容和流量帶寬支持不太完美,選擇了使用 AWS 的公有云作為服務(wù)基礎(chǔ)環(huán)境。對于第三方的服務(wù),缺少實踐經(jīng)驗的把握,于是從開發(fā)到運維過程中,我們都保持了一種防御式的思考方式,包括數(shù)據(jù)庫、緩存節(jié)點故障,以及應(yīng)用服務(wù)環(huán)境的崩潰、網(wǎng)絡(luò)抖動,我們都認為隨時可能出問題,都需要對應(yīng)的自動替換降級策略,嚴重時甚至可手動觸發(fā)配置開關(guān)修改策略。當然,如果組件自身具有降級功能,可以給上層業(yè)務(wù)節(jié)約很多成本資源,要自己實現(xiàn)全部環(huán)節(jié)的降級能力的確是一件比較耗費資源的事情,這也是一個公司技術(shù)慢慢積累的過程。

結(jié)束語

以上就是我們整個系統(tǒng)研發(fā)運維的一些經(jīng)驗分享。對于這類瞬時大流量的秒殺系統(tǒng)而言,高可用是最大的優(yōu)化目標,分而治之是核心的架構(gòu)思想;防御式思維,假定任何環(huán)節(jié)都可能有弱點,能夠提升系統(tǒng)的穩(wěn)定性。另外,一定要加強監(jiān)控,及時發(fā)現(xiàn)問題,解決問題。做好了如上幾點,相信各位讀者在應(yīng)對類似問題時,也能更加全面的思考,少走一些彎路,做出更加優(yōu)秀的系統(tǒng)。

這次春節(jié)紅包活動,在資源有限的情況下成功抵抗超乎平常的流量峰值壓力,對于技術(shù)而言是一次很大的挑戰(zhàn),也是一件快樂的事情,讓我們從中積累了很多實踐經(jīng)驗。未來我們將不斷努力,希望能夠?qū)⒉糠洲D(zhuǎn)化成較為通用的技術(shù),沉淀為基礎(chǔ)架構(gòu)組件,去更好的推動業(yè)務(wù)成功。真誠希望本文的分享能夠?qū)Υ蠹业募夹g(shù)工作有所幫助。

參考資源

  • WRK,一種強悍的大流量請求壓測工具。
  • 一號店秒殺系統(tǒng)的參考做法。
  • 電商系統(tǒng)可用的秒殺系統(tǒng)做法。
  • JVM 優(yōu)化建議。
  • Ganglia,開源集群監(jiān)視框架。

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/8971017.html

總結(jié)

以上是生活随笔為你收集整理的如何设计一个小而美的秒杀系统?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。