雙十一,剁手黨的節日,恨不能是各大電商程式設計師的忌日。
京東,作為全國買買買炮火的主要目標,架構師、碼農們一邊承擔著全國人民打折購物的殷切期望,一邊承受著老闆東哥如芒在背的犀利目光。
總之,一旦出現閃失,後果不堪設想。
那麼,究竟架構師們如何萬無一失地完成這樣「不允許失敗」的任務呢?
在今天的 SDCC 中國軟體開發者大會上,京東商城總架構師、基礎平臺負責人劉海鋒為現場觀眾介紹了今年保衛京東雙十一的「五大法寶」。
【京東商城總架構師、基礎平臺負責人 劉海鋒】
好鋼留在刀刃上:資源規劃
說到底,雙十一最大的挑戰就是訪問和業務激增。如果能夠提供無限的帶寬和計算資源,那麼雙十一和其他日期不會有任何可以感知的區別。
然而,資源永遠是有限的。這就好像一個人往往不能又買房又買車還天天吃大餐。從這個角度來說,資源規劃就變得非常重要。
每當各種電商節來臨之前,各路部門都變成了嗷嗷待哺的雛鳥。恨不能張口就要十倍於平時的資源。
不過劉海鋒說:
大家都覺得資源充分才不會出問題。但是事實證明,有些部門多準備一些 CPU,心理上可能輕敵,在代碼上就放鬆了警惕,這樣未必可以活下;相反資源不那麼充足的情況下,反而未必死掉。
那麼,有限的 CPU 究竟分給誰呢?
【前端用戶下單方法調用雙十一峰值達到了平均值的16倍,而機房內網絡流量峰值只有平均值的1.5倍】
根據劉海鋒的研究,京東商城前端的訪問系統在零點之前的十幾秒負載達到峰值。幾秒內就可以達到平均值的16倍。這是因為大家都已經選好了想要的商品,只等零點之前刷新下單。但是,這樣狂飆的訪問量在系統內部卻沒有表現得如此恐怖。在系統內部,訪問量可能只有平時的 1.5倍。
我們把各個系統分為兩類:平穩型系統和毛刺型系統。平穩型系統,包括商品的詳情頁、價格頁面、庫存信息等等;毛刺型系統,包括下單、秒殺頁面、搶購頁面等等。
做了細緻的研究之後,對於資源的分配就有了依據。這樣就可以在保證核心流程充分擴容的基礎上,再來滿足錦上添花的功能需求。
「逼」內存做存儲:夯實基礎架構
基礎架構是京東商城的基礎。而在巨大訪問中一旦基礎架構出現了問題,會影響無數附加其上的應用。為了保證這個龐大的基礎架構,京東做了一些重點動作。
多數據中心
劉海鋒說,一個機房的安全係數永遠不夠,一旦出問題將會造成不可估量的損失。所以京東採用了多數據中心的策略。
這種冗餘策略存在於包括電商在內的很多服務中。是一種通用的手段,當然京東也不例外。
全面容器化
京東從2014年開始,對系統進行 Docker 容器化改造。
通俗來說,「容器化」就是把系統的各項資源進行虛擬化,可以更加自由地分配給各個服務。
這種改造有一個巨大的優勢,那就是極大地加快了資源交付和速度,更小地細分了資源的粒度。劉海鋒說,2014年之前,大促時各個系統分資源還在分物理機,而現在大家可以直接分 CPU,系統在後臺直接把 CPU 的計算能力分配給需要的部門。
「逼」內存做磁碟
在京東的構架中,內存可以被用作存儲器,而不是緩存。劉海鋒說,這就是所謂的 JIMDB(以內存為中心的存儲)。
眾所周知,硬碟是在電子化的 IT 架構中,唯一一個還在使用機械結構的元件。它的效率之低令人髮指。所以在大促的時候,訂單內容和實時護具不會回到後臺存儲,直接在內存中被調用。這樣就大大提縮短了系統響應時間。
為此,京東的內存容量儲備達到了 260T。
大促的時候,99%的訪問請求最高延遲都小於 5 毫秒。
劉海鋒說。
消息平臺 JMQ
在京東的體系中,最重要的可能就是訂單和運單數據。而這些數據需要在許多系統內部實時同步。
很多下遊系統關心訂單信息。按照傳統的思路,所有下遊系統都想要獲得訂單信息,必須通過訂單系統,調用其他的接口才能實現。這樣就會給訂單系統帶來極大的壓力。
針對這個矛盾,京東開發了消息平臺 JMQ。JMQ 的工作原理很簡單,大致相當於信息統籌的秘書。訂單系統只需要把數據交給 JMQ,其他系統只需要調用 JMQ 就可以查看信息。這在客觀上大大緩解了訂單系統的壓力。
預測屌絲取消訂單:增強智能
雙十一,所有系統資源全部被調動起來。人工智慧,這個正在井噴的高科技也可以在這個時候「幫工」。
不過,劉海鋒告訴雷鋒網,這並不是什麼虛頭巴腦的大概念,而是一些接地氣的小功能。所以他更願意把它叫做「增強智能」。
增強智能在京東商城的體系內應用場景不少,例如:客服機器人、庫存優化、信息合規校驗、智能物流倉儲等等。劉海鋒舉了兩個有趣的例子。
【替用戶冷靜的「訂單冷靜管道」】
訂單冷靜:屌絲衝動購物的後悔藥
如果我看到別人在大促的當天買了一部手機送給女朋友。我一衝動,一次購買了兩臺,冷靜下來想想, 我還沒有女朋友。這個時候,我可能會選擇退貨。
劉海鋒說。
然而,京東的很多產品都是自營,在下單之後幾分鐘內就已經開始分揀打包。然而, 系統訂單是在幾小時內都支持取消的。
這時,如果用戶選擇了取消訂單,那麼打包工作就浪費了。這對於雙十一期間資源相對寶貴的京東來說,就是一種資源浪費。
這時,就到了人工智慧顯示威力的時候。
如果系統探測到下單買兩部 iPhone 的用戶,經常買奢侈品送給(不同的)女朋友,那麼沒事。如果探測到這個用戶以前購買的最貴的商品就是200塊錢的食用油,並且通過大數據分析,這位用戶可能沒有女朋友。那麼就在後臺自動把訂單「冷靜」10-20分鐘。如果用戶沒有後悔取消訂單,再繼續大寶流程。這有助於減少浪費的成本。
訂單預測:從下單到送到只需 12 分鐘
在雙十一當天,凌晨第一單從下單到出庫到用戶籤收僅僅用了12分31秒。這個看起來有點假的成績是怎麼取得的呢?
如果從下單開始,才從最大的倉庫備貨,12分鐘也許都不夠用來分揀。能夠做到這麼快,要歸功於「訂單預測系統」 。
【訂單預測系統工作原理】
劉海鋒講解了訂單預測系統的工作原理:
一個商圈,將會在雙十一購買多少手機、電池、尿布、啤酒這類標準品,是可以通過大數據來預測的。而京東的庫房是分級的。有後端的倉儲和前端的倉儲。通過預測,京東會提前把一些商品前置到前端倉(FDC),這樣在用戶下單之後就可以瞬間從倉庫發出,就近送到用戶手裡。
「自殘式」演習:大規模故障模擬演練
驗證技術團隊可靠性的最好方式,莫過於真槍實彈的技術演習。
Chaos Monkey,是很多平臺都在使用的故障演習模式,簡單說來就是隨即關閉生產環境中的實例,然後檢查系統是否能經受故障考驗。
劉海鋒把這個英語詞彙改成了更接地氣的中文名稱——響尾蛇。
總之,就是在雙十一真正的考驗來臨之前,用一種「自殘」的方式來檢查系統的可靠性。
劉海鋒介紹,京東的「響尾蛇」行動玩法如下:
把運維人員分為兩組,一組資深的運維工程師在會議室裡,負責模擬故障。而在會議室外面,是負責解決問題的小組。對於將要出現什麼問題,會議室外面的小組是毫不知情的。模擬故障五花八門,從機器到網絡,到模塊,到服務,到中間件和資料庫,甚至整個機房消失。應急小組都必須給出合理的處置方法,拼死保證業務不出現問題。
劉海鋒說,「由於這種演練具有一定的破壞性,所以我們都是在半夜一點到三點之間進行。」
軍演機器人:全鏈路壓力測試
所謂壓力測試,就是在真實模擬無數人訪問京東並作出各種請求的情況下, 測試系統能否正常運作。
雖然各個環節的工程師都會對自己的系統進行壓力測試,但是畢竟這種測試是分散的,導致最終容易在各個業務的接口處產生問題。而且,普通的壓力測試,很難模擬真實用戶的訪問行為。
為此,劉海鋒專門讓團隊開發了「軍演壓力測試機器人」。
這個機器人,就是模擬我們僱傭一億人同時訪問我們網站的行為。這套程序分布在全國各地,對我們的業務做全鏈路的讀寫混合壓力測試。
如同軍演一樣,全鏈路的壓力測試並不如想像般容易實現。例如,這樣的演習不能使用真正的銀行支付,不能影響真正的庫存數量,不能動用真的物流。所以,和演習相關的所有上下遊業務,都要設計一套虛擬系統。
在這套「軍事演習」裡,最重要的步驟就是「黃金鍊路壓力測試」。所謂黃金鍊路,就是普通用戶使用京東的「標準流程」,包括:登錄,搜索,瀏覽,購物,結算,支付。這個鏈路,是雙十一用戶體驗的最主要體現。京東的工程師們不斷對這個鏈路進行測試,就可以發現很多存在的問題。
【黃金鍊路壓力測試流程】
以上,就是京東保障正在看文章的你「剁手順利」的五大法寶。僅僅是24小時的買買買,背後卻涉及無數風險控制手段和資源調度模型。
正如劉海鋒所說,
雙十一是電商企業整體技術能力的一個縮影,各個電商在保障的過程中都會有一些插曲,正是這些小問題,讓中國的電商行業不斷地成長。
SDCC,中國軟體開發者大會。由全球最大中文 IT 社區 CSDN 於2007年創辦,每年舉辦。主題是下一代軟體開發技術趨勢與對各行業的深刻影響,以談乾貨實料著稱。