新聞中心
【稿件】在大流量、高銷量的背后,是我們近半年來付出的努力,針對拼購系統(tǒng)瞬時高并發(fā)能力的優(yōu)化與升級,才能保證消費者絲滑順暢的購物體驗。下面就來介紹下蘇寧拼購系統(tǒng)應(yīng)對大促的術(shù)與道。

我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、來鳳ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的來鳳網(wǎng)站制作公司
術(shù)為用:拼購系統(tǒng)高可用的架構(gòu)設(shè)計
“術(shù)”是架構(gòu)設(shè)計的方法論。拼購系統(tǒng)的架構(gòu)歷經(jīng)多次更新和迭代,其目的是打造一個高可用、高性能、易擴展、可伸縮性強的應(yīng)用系統(tǒng)。
將整個過程精煉出來,我們主要做了三個方面的工作:
- 系統(tǒng)架構(gòu)優(yōu)化設(shè)計
- 數(shù)據(jù)庫性能的優(yōu)化
- 應(yīng)用高可用的優(yōu)化
系統(tǒng)架構(gòu)優(yōu)化設(shè)計
根據(jù)康威定律,組織形式等同系統(tǒng)設(shè)計。拼購系統(tǒng)之前為了滿足快速的開發(fā)迭代節(jié)奏,所有功能是放在一個集群中的。
隨著業(yè)務(wù)的發(fā)展,功能越來越復雜,單一集群已經(jīng)成為限制系統(tǒng)性能的***瓶頸。
圖 1:蘇寧拼購系統(tǒng)架構(gòu)設(shè)計
因此,系統(tǒng)優(yōu)化所做的***件事情就是對拼購系統(tǒng)架構(gòu)進行了重構(gòu)。一方面,進行橫向切分,將系統(tǒng)分層,包括:
- 網(wǎng)絡(luò)層:通過 CDN 加速響應(yīng)。一方面 CDN 緩存提高靜態(tài)內(nèi)容訪問速度,減少服務(wù)端壓力;另一方面,CDN 內(nèi)部網(wǎng)絡(luò)專線,加快回源速度。
- 負載層:包括四層負載和七層負載。功能包括流量調(diào)度、流量控制、安全防護、黃牛防護等,另外在負載層也做了一些輕量級業(yè)務(wù)的 Lua 聚合,以提高響應(yīng)性能。
- 應(yīng)用層:這層主要實現(xiàn)業(yè)務(wù)功能邏輯。
- 服務(wù)層:為應(yīng)用層提供原子服務(wù),如會員、領(lǐng)券、尋源、時效、生成訂單、支付等。
- 數(shù)據(jù)層:提供數(shù)據(jù)存儲訪問服務(wù),如數(shù)據(jù)庫、緩存等;提供數(shù)據(jù)抽取分析服務(wù),如 Hbase、Hive。
另一方面,針對拼購的業(yè)務(wù)特性,進行縱向切分,將原來耦合的功能邏輯拆分為三層:PGS-WEB、PGS-TASK-WEB、PGS-ADMIN_WEB。
每個模塊獨立集群部署,集群之間通過分布式遠程調(diào)用與服務(wù)層提供的原子服務(wù)協(xié)同工作。其中:
- PGS-WEB:前臺業(yè)務(wù)處理模塊。包括展示、交易、營銷三個單元模塊。每個模塊又能分割為更小粒度的子模塊。
比如營銷模塊就又能細分為四個輕量級玩法模塊:邀新團、砍價團、膨脹紅包和助力團,可以針對業(yè)務(wù)需要,對不同模塊進行拔插、拆分和擴展。
- PGS-TASK-WEB:中臺定時任務(wù)處理模塊,主要用于處理定時任務(wù),另外支付邏輯也在這一層。
- PGS-ADMIN_WEB:后臺管理模塊,主要用于運營人員維護活動、商品、玩法等。
數(shù)據(jù)庫性能優(yōu)化
在高并發(fā)場景下,提交訂單、生成拼團記錄、查詢訂單等操作,會對數(shù)據(jù)庫造成很大壓力,而這些一致性要求高的操作又不能直接使用分布式緩存替代數(shù)據(jù)庫。
而給數(shù)據(jù)庫降溫,提高數(shù)據(jù)庫的并發(fā)處理能力,必須讓數(shù)據(jù)庫具備橫向擴展能力。因此我們基于 Mycat 數(shù)據(jù)庫中間件實現(xiàn)了拼購系統(tǒng)數(shù)據(jù)庫的分庫分表策略。
圖 2:高并發(fā)場景下 MySQL 數(shù)據(jù)庫負載能力趨勢
Mycat 是 MySQL 分庫分表中間件,和 Web 服務(wù)器的 Nginx 類似,是應(yīng)用與數(shù)據(jù)庫之間的代理層。
由于 Mycat 是開源中間件,這里對技術(shù)實現(xiàn)不做闡述,主要講下它在拼購系統(tǒng)下是如何應(yīng)用的。
如下圖所示,業(yè)務(wù)邏輯的數(shù)據(jù)操作通過 Mycat 分為三個庫 DataNode 1~3,這個分庫過程應(yīng)用本身是無感知的。
圖 3:蘇寧拼購系統(tǒng)基于 Mycat 的分庫架構(gòu)
每個庫一寫兩讀,針對團和團詳情的操作分片規(guī)則基于團 ID(GROUP_ID),針對訂單的操作分片規(guī)則基于訂單 ID(ORDER_ID)。
另外,還有一個單獨的 BackupDB 用于大數(shù)據(jù)抽取和數(shù)據(jù)備份,通過 Canal 保證 BackupDB 中是全量數(shù)據(jù)。
當 Mycat 出現(xiàn)問題時,我們可以通過應(yīng)用層的數(shù)據(jù)源切換,降級為單庫,保證業(yè)務(wù)。
應(yīng)用高可用優(yōu)化
對于應(yīng)用層面的優(yōu)化,主要包括分布式緩存和異步化兩方面。
利用 Redis 分布式鎖解決并發(fā)場景一致性問題
比如為了防止訂單被重復處理,我們使用 Jedis 的事務(wù) Transaction + SETNX 命令來實現(xiàn) Redis 分布式鎖:
- Transaction transaction = jedis.multi();//返回一個事務(wù)控制對象
- transaction.setnx(tmpLockKey, "lock");//Set if Not Exist
- transaction.expire(tmpLockKey, locktime);
- List
利用 Redis 實現(xiàn)活動庫存,解決數(shù)據(jù)庫資源競爭問題
對于每一個拼團活動,我們是維護了活動庫存的,或者叫做資格/剩余數(shù),并非真正的實際庫存。
在 1 元秒殺等活動中,這個活動庫存的變化會很迅速,大量數(shù)據(jù)庫 UpDate 操作,造成行鎖非常影響系統(tǒng)吞吐率。
優(yōu)化方案是 在Redis 中做活動庫存扣減,并以一定周期同步給數(shù)據(jù)庫:
- /**
- * Redis緩存扣減活動庫存
- * */
- private Long updateStoreByRedis(String actId, String field, int count) {
- String key = redis.key(PGS_STORE_INFO, actId);
- // 如果活動庫存緩存信息存在,則更新對應(yīng)field的數(shù)量
- if (!redis.exists(key)) {
- // 從數(shù)據(jù)庫讀取該活動庫存信息并初始化到redis
- ActivityStoreEntity entity = queryStoreInfoFromDb(actId);
- if (entity == null) {
- return -1L;
- }
- Map
values = new HashMap (); - values.put(PGS_STORE_ALL,…);
- values.put(PGS_STORE_REMAIN, …);
- values.put(PGS_STORE_LOCK, …)
- redis.hmset(key, values);
- // 若活動有效期內(nèi)庫存緩存信息失效,初始化緩存信息一小時
- redis.expire(key, ONE_HOUR);
- }
- return redis.hincrby(key, field, count);
- }
- /**
- * Redis同步活動庫存給數(shù)據(jù)庫
- * */
- public int syncActivityStoreToDB(String actId) {
- …
- try {
- // 判斷同步鎖狀態(tài)
- String key = redis.key(PGS_STORE_SYNC, actId);
- if(!redis.exists(key)){
- 更新活動可被鎖庫存數(shù)量
- redis.setex(key, actId,STORE_SYNC_TIME);
- }
- }
- } catch (Exception e) {
- Log;
- }
- …
- }
異步化操作,消除并發(fā)訪問高峰
比如支付完成后,有一系列的后續(xù)處理流程,包括活動庫存扣減、拼團狀態(tài)變更等,其中有些邏輯實時性要求高,要同步處理。
有些則可以通過異步化的方式來處理,像通知物流發(fā)貨。我們采用 Kafka 隊列來進行異步通信,讓下游系統(tǒng)進行消費處理。
道為體:拼購系統(tǒng)高并發(fā)下的保障體系
“以道馭術(shù),術(shù)必成。離道之術(shù),術(shù)必衰?!蔽覀兯械募軜?gòu)優(yōu)化與升級最終目的是為了保障促銷高峰的穩(wěn)定性。
拼購系統(tǒng)高并發(fā)場景下的保障之道,是以合理的容量規(guī)劃為基礎(chǔ),全面覆蓋的監(jiān)控體系為支撐,形成的完善的限流+降級+防控策略。
全鏈路壓測與容量規(guī)劃
根據(jù)業(yè)務(wù)預(yù)估量,生產(chǎn)環(huán)境針對蘇寧拼購全鏈路場景的壓測,才能做出合理的容量規(guī)劃。
目前,我們的壓測系統(tǒng),可以支持引流壓測,即將線上真實流量復制下來,生成腳本,進行壓測。***程度保證了壓測和真實情況的一致性,從而使容量規(guī)劃更精確。
端到端覆蓋的監(jiān)控體系
目前蘇寧拼購的監(jiān)控體系能夠做到端到端的覆蓋,包括客戶端->網(wǎng)絡(luò)->服務(wù)端的監(jiān)控。
其中,客戶端監(jiān)控依賴于覆蓋 PC + WAP + App 的終端日志。網(wǎng)絡(luò)監(jiān)控主要是 CDN 日志和撥測數(shù)據(jù)。
服務(wù)端監(jiān)控手段最為豐富,包括:
- 服務(wù)器系統(tǒng)狀態(tài)監(jiān)控:CPU、內(nèi)存使用率、網(wǎng)卡流量、磁盤 IO 等。
- Web 服務(wù)器監(jiān)控:實時展現(xiàn) Web 服務(wù)器的 Http 連接數(shù)、響應(yīng)時間、Http 異常、狀態(tài)碼等指標。
- 應(yīng)用服務(wù)器異常監(jiān)控:實時匯總應(yīng)用異常堆棧信息。
- JVM 狀態(tài)監(jiān)控:實時展現(xiàn)JVM的內(nèi)存、線程、GC 和 Class 的使用狀況。
- NoSQL 監(jiān)控:Redis 每分鐘命令數(shù)、大對象、連通性等的監(jiān)控。
- 數(shù)據(jù)庫監(jiān)控:數(shù)據(jù)庫層面各項指標監(jiān)控。
- 調(diào)用鏈監(jiān)控:實時展現(xiàn)應(yīng)用間調(diào)用關(guān)系,反饋鏈路系統(tǒng)健康狀況。
這些監(jiān)控系統(tǒng)通過 traceId 相串聯(lián),與基礎(chǔ)運維平臺打通,最終通過決策分析平臺聚合,實現(xiàn)智能告警。
圖 4:端到端監(jiān)控體系與告警決策平臺
流量控制與風險控制
流量控制是針對 88 拼購日零點峰值瘋狂流量超出預(yù)期,所設(shè)置的限流,以保護好自身應(yīng)用,否則出現(xiàn)雪崩式連鎖反應(yīng)。
目前拼購的流控系統(tǒng)可以支持多個維度的流控策略。包括最基礎(chǔ)的 JVM 活躍線程數(shù)流控,針對用戶 IP、UA 和會員編號的限流,針對核心接口的限流策略,針對爆款商品的限流策略等等。
圖 5:拼購流控系統(tǒng)架構(gòu)
風險控制是針對 88 拼購日爆款商品被黃牛刷單風險的防控策略。除了傳統(tǒng)的黃牛庫名單,拼購的風控策略包括對用戶、地址、事件行為、設(shè)備指紋等的判斷。
區(qū)別于非黑即白的防控,拼購采用打分的方式對用戶進行畫像,對潛在的風險用戶采取短信驗證、滑動驗證、人臉識別等一些列挑戰(zhàn)模式。
大促準備與應(yīng)急預(yù)案
大促準備工作是指結(jié)合業(yè)務(wù)的促銷節(jié)奏,梳理的一系列大促準備工作,包括非核心定時任務(wù)的提前降級、生產(chǎn)操作權(quán)限的回收等。
應(yīng)急預(yù)案是針對大促可能發(fā)生的突發(fā)性事件梳理的預(yù)案,應(yīng)急預(yù)案是建立在降級手段的基礎(chǔ)上的。
比如關(guān)鍵時候?qū)Σ糠止δ艿慕导夑P(guān)閉操作,棄車保帥,保障購物流程的正常;再比如針對服務(wù)器性能瓶頸的降溫手段,只有在準備好應(yīng)對一切突發(fā)情況的前提下,才能保證每次大促的順利完成。
結(jié)束語
路漫漫其修遠兮,今年的 88 蘇寧拼購日已經(jīng)告一段落。未來向我們提出了更多的挑戰(zhàn)與機遇。
如何進一步突破系統(tǒng)性能瓶頸,如何給用戶提供個性化的推薦與服務(wù),如何將拼購做成一個開放的社交化電商平臺,蘇寧拼購技術(shù)團隊要做的工作仍然有很多。
我們將繼續(xù)前行,勢不可擋,并為大家?guī)沓掷m(xù)的技術(shù)分享與更新。
作者:朱羿全、任章雄、張濤、龔召忠
簡介:朱羿全,南京航空航天大學碩士研究生畢業(yè),蘇寧易購消費者研發(fā)中心高級技術(shù)經(jīng)理,主要負責易購各系統(tǒng)架構(gòu)優(yōu)化與大促保障工作。先后參與了易購整站 Https 改造、蘇寧拼購架構(gòu)改造、先知業(yè)務(wù)監(jiān)控平臺建設(shè)等工作。專注于打造高可靠、高性能、高并發(fā)服務(wù)系統(tǒng)的技術(shù)研究。
【原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為.com】
當前名稱:500萬日訂單下的高可用拼購系統(tǒng),到底暗藏了什么“獨門秘籍”?
分享地址:http://fisionsoft.com.cn/article/djiphde.html


咨詢
建站咨詢
