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