每秒能支撐的峰值訂單數(shù)是衡量電商系統(tǒng)高并發(fā)可擴(kuò)展能力的重要體現(xiàn),在電商內(nèi)提升每秒支撐訂單數(shù)存在無數(shù)的方法,每一個(gè)方法都存在各自的優(yōu)化角度和對(duì)應(yīng)的障礙挑戰(zhàn),如何在一開始根據(jù)自身企業(yè)的特點(diǎn)選擇最合適的優(yōu)化路徑,并其后在這路徑上高效貫徹和執(zhí)行,對(duì)于團(tuán)隊(duì)尤其是初創(chuàng)團(tuán)隊(duì)而言都不是簡(jiǎn)單的事情。現(xiàn)在我們就來采訪七公老師,看看蘑菇街是如何快速走出一條高效、實(shí)用的服務(wù)化發(fā)展路徑的。
InfoQ:在2014年以前您在阿里巴巴B2B負(fù)責(zé)Aliexpress資金中心等項(xiàng)目,能否談?wù)勗诎⒗锏倪@段經(jīng)歷給您之后出國游歷、回國加入蘑菇街帶來了哪些動(dòng)因和影響?
七公:我是2011年3月加入阿里巴巴的,彼時(shí)阿里整個(gè)的業(yè)務(wù)、技術(shù)體系都處在一個(gè)飛速發(fā)展的時(shí)期,我個(gè)人也獲得了飛快的成長(zhǎng)。受去看世界的夢(mèng)想推動(dòng),2014年8月我和女朋友一起從阿里辭職,出國游歷了半年。
回來之后,阿里當(dāng)時(shí)內(nèi)部各方面整體已經(jīng)趨向穩(wěn)定,我希望找到另一家飛速發(fā)展的公司,北京上海找了一圈不滿意,最終還是回到了杭州,加入了蘑菇街。在蘑菇街一年的時(shí)間里,我們業(yè)務(wù)和技術(shù)都獲得了火箭般的飛躍式前進(jìn),我一年里的進(jìn)步和收獲比在其他公司呆兩年得到的還要多,實(shí)現(xiàn)了和公司的共進(jìn)步、同成長(zhǎng)。
InfoQ:您加入蘑菇街電商團(tuán)隊(duì)后帶領(lǐng)團(tuán)隊(duì)同學(xué)僅用一年便完成服務(wù)架構(gòu)的各階段升級(jí),能否談?wù)勀銈兪侨绾我?guī)劃優(yōu)化路徑并高效實(shí)現(xiàn)的?在高效率工作上你們有什么經(jīng)驗(yàn)或技巧可以分享?
七公:第一個(gè)階段【蘑菇街系統(tǒng)拆分&服務(wù)化1.0體系構(gòu)建】,是我們做PHP全面轉(zhuǎn)型Java體系、初步建成電商基礎(chǔ)服務(wù)中心的戰(zhàn)略規(guī)劃,在面臨不停歇的業(yè)務(wù)需求和巨大的系統(tǒng)改造壓力下,我們采用瀑布流工程方法,通過規(guī)劃、分析、設(shè)計(jì)實(shí)現(xiàn)、測(cè)試、服務(wù)產(chǎn)品&文檔交付的過程,高質(zhì)量地把第一階段的服務(wù)化建設(shè)根基像打樁一樣打牢,然后通過進(jìn)一步的迭代開發(fā)不斷完善。
第二階段【購買鏈路核心服務(wù)的性能提升&服務(wù)架構(gòu)1.5】和第三階段【服務(wù)SLA保障推動(dòng)穩(wěn)定性提升&服務(wù)架構(gòu)2.0】,實(shí)際上是業(yè)務(wù)迅猛發(fā)展、流量不斷上漲、日常和大促穩(wěn)定性保障的強(qiáng)烈需求推動(dòng)我們自身服務(wù)架構(gòu)的升級(jí)。我們通過引入Scrum的敏捷開發(fā)模式,項(xiàng)目中的每個(gè)人都是豬(敏捷開發(fā)中,豬為項(xiàng)目負(fù)責(zé)人,雞只是普通參與者,寓意來自豬要犧牲才能提供食物而雞只要下個(gè)蛋就行了),每個(gè)人都要為服務(wù)框架升級(jí)和項(xiàng)目進(jìn)展負(fù)責(zé)。
我們先后有十人以上共同推進(jìn)了服務(wù)框架負(fù)載均衡、降級(jí)限流、連接切換優(yōu)化等基礎(chǔ)框架演進(jìn),以及監(jiān)控、服務(wù)端超時(shí)控制、多版本、分組隔離、動(dòng)態(tài)路由等服務(wù)治理體系完善。
總結(jié)一下:高效推進(jìn)上,我們的經(jīng)驗(yàn)是首先要采用項(xiàng)目的方式進(jìn)行管理,再一個(gè)是時(shí)機(jī)不同、階段不同,選擇的項(xiàng)目工程方法也不一樣:
新架構(gòu)探索:建議采用傳統(tǒng)的瀑布式和迭代式開發(fā);
架構(gòu)的持續(xù)迭代:可以嘗試一些新的開發(fā)方法。
InfoQ:能否介紹蘑菇街系統(tǒng)架構(gòu)的中間件系統(tǒng)?蘑菇街的一系列中間件是如何實(shí)現(xiàn)Web應(yīng)用層和基礎(chǔ)設(shè)施層對(duì)接的,各中間件如何確保在全站穩(wěn)定落地?
七公:蘑菇街購買鏈路服務(wù)架構(gòu)示意圖:
從蘑菇街購買鏈路服務(wù)架構(gòu)1.0到1.5,我們完成了服務(wù)化框架Tesla、分庫分表TSharding、分布式緩存MoguCache、Corgi MQ、配置中心Metabase、調(diào)用鏈跟蹤Lurker等一系列重要中間件的自研、完善和在全站落地。這一系列中間件的研發(fā),是隨著業(yè)務(wù)系統(tǒng)和服務(wù)框架的不斷發(fā)展(最早我們只有Tesla一個(gè)中間件)而逐步衍生出來的。2015年初,蘑菇街全網(wǎng)還在PHP體系,Tesla框架誕生后,我們先構(gòu)建了用戶、商品、交易、促銷等一系列的電商基礎(chǔ)服務(wù)中心:
Tesla框架支撐了PHP Web應(yīng)用到服務(wù)中心的PRC調(diào)用場(chǎng)景;
服務(wù)中心內(nèi)部有數(shù)據(jù)容量提升需求,所以先后有了TSharding和Raptor分庫分表中間件;
服務(wù)內(nèi)部有異步化處理需求,有了Corgi MQ;
服務(wù)中心內(nèi)部有分布式緩存需求,所以有了MoguCache等;
所以服務(wù)框架是支撐和推動(dòng)整個(gè)網(wǎng)站架構(gòu)發(fā)展的核心和源動(dòng)力。2015年底我們啟動(dòng)了PHP Web單體應(yīng)用拆分為一個(gè)個(gè)Java Web業(yè)務(wù)應(yīng)用和前后端分離項(xiàng)目,很快購買鏈路完成了PHP體系到Java生態(tài)的徹底升級(jí)。
Tesla走向真正的服務(wù)框架(而不僅僅是一個(gè)RPC框架)是隨著業(yè)務(wù)的不斷發(fā)展和業(yè)務(wù)系統(tǒng)的強(qiáng)烈要求開始的。最早業(yè)務(wù)系統(tǒng)面臨服務(wù)發(fā)布時(shí)不平滑(客戶端幾秒甚至數(shù)10秒后才拉到更新的IP列表)等問題,以及業(yè)務(wù)服務(wù)蓬勃發(fā)展時(shí)期強(qiáng)烈的服務(wù)治理需求,Tesla不斷進(jìn)行服務(wù)框架的改造升級(jí):
通過新的配置中心Metabase的誕生和客戶端拉取配置優(yōu)化、客戶端響應(yīng)服務(wù)端連接關(guān)閉事件解決連接優(yōu)化問題;
通過對(duì)監(jiān)控預(yù)警、動(dòng)態(tài)限流、服務(wù)端超時(shí)、服務(wù)分組等的支持完善了服務(wù)治理體系。
實(shí)際上業(yè)界的眾多服務(wù)框架也是這么一步步發(fā)展起來的,沒有捷徑。
中間件在全站的有效落地,是靠中間件團(tuán)隊(duì)和業(yè)務(wù)系統(tǒng)支撐團(tuán)隊(duì)密切配合完成的。新的中間件剛剛開發(fā)出來,肯定會(huì)有各種問題出現(xiàn),但是中間件也是業(yè)務(wù)系統(tǒng)的實(shí)際需求推動(dòng)才產(chǎn)生的,所以雙方的目標(biāo)、利益點(diǎn)是相同的。我們會(huì)采用項(xiàng)目的方式,每個(gè)項(xiàng)目成員都對(duì)中間件的使用推廣和自身完善負(fù)責(zé),共同推動(dòng)中間件在全站的穩(wěn)定落地。
InfoQ: 在中間件研發(fā)過程中,開源技術(shù)起到怎樣的作用?
七公:蘑菇街是擁抱開源技術(shù)的。在我們的技術(shù)體系中,很大一部分基礎(chǔ)技術(shù)組件依賴于開源產(chǎn)品。我們的Tesla服務(wù)框架是基于Netty開發(fā)的,最早我們用的MQ是RabbitMQ,后來我們才轉(zhuǎn)向自研;我們的Sentry監(jiān)控平臺(tái)是基于Grafana;目前我們?nèi)匀辉趶V泛使用Kafka來收集全站日志,使用Zookeeper協(xié)調(diào)分布式系統(tǒng),使用Hadoop生態(tài)來支撐數(shù)據(jù)平臺(tái)計(jì)算任務(wù)等等。
而自研Tesla、Corgi MQ等等中間件的原因是因?yàn)檫@些是支撐我們網(wǎng)站發(fā)展的核心產(chǎn)品,我們必須要能夠完全掌控、有能力做到深度定制,以便快速支持業(yè)務(wù)發(fā)展,而不是成為業(yè)務(wù)發(fā)展的瓶頸和阻礙;而這些中間件的誕生、持續(xù)發(fā)展和在全站落地之后,變成了我們技術(shù)團(tuán)隊(duì)乃至整個(gè)蘑菇街的核心競(jìng)爭(zhēng)力之一。
針對(duì)純技術(shù)的中間件/產(chǎn)品,我們會(huì)選擇性的開源。TSharding是我們最早的分庫分表中間件,之前因?yàn)橛行∶?、有贊等不少技術(shù)同仁都有咨詢,所以我們開放在了Github上,見https://github.com/baihui212/tsharding。
InfoQ: 如何通過數(shù)據(jù)分析來指導(dǎo)“前瞻性地謀劃實(shí)施、支撐業(yè)務(wù)快速發(fā)展”?在電商中哪些數(shù)據(jù)發(fā)生怎樣的變化會(huì)給系統(tǒng)架構(gòu)帶來預(yù)警,提示需要改良或優(yōu)化?能否結(jié)合談?wù)勀銈兊姆逯迪到y(tǒng)的監(jiān)控架構(gòu)和方案?
七公:“前瞻性地謀劃實(shí)施”可以通過關(guān)注業(yè)務(wù)數(shù)據(jù)和系統(tǒng)數(shù)據(jù)的增長(zhǎng)變化情況來獲得一個(gè)合理的度。通過當(dāng)前業(yè)務(wù)的增速能推算出來三五年內(nèi)的業(yè)務(wù)爆發(fā)和數(shù)據(jù)增長(zhǎng)情況,如果有些架構(gòu)上的不適宜(如過度中心化或存在易攻擊點(diǎn)、系統(tǒng)難以擴(kuò)展或者穩(wěn)定性難以保障等問題),要盡早規(guī)劃新的架構(gòu)形態(tài)并快速推進(jìn)實(shí)施,提早解除可能阻礙業(yè)務(wù)發(fā)展的絆腳石。但是也不能過度設(shè)計(jì),考慮五年以后、十年以后的情況做設(shè)計(jì),可能還未到時(shí)候,現(xiàn)有架構(gòu)早就過時(shí)了。
電商數(shù)據(jù)比較復(fù)雜,概括如下:
業(yè)務(wù)數(shù)據(jù)
目前我會(huì)關(guān)注DAU,分平臺(tái)的GMV、UV、客單價(jià)、支付訂單數(shù)、支付用戶數(shù)等。
系統(tǒng)數(shù)據(jù)
主要是容量和系統(tǒng)運(yùn)行情況,容量包括數(shù)據(jù)庫表空間、磁盤使用情況、服務(wù)應(yīng)用的水位、緩存集群的分片情況等;系統(tǒng)運(yùn)行狀態(tài)主要包括QPS、RT、調(diào)用成功率、CPU占用率、內(nèi)存使用、IO等。
只要持續(xù)關(guān)注這些核心數(shù)據(jù),才能敏銳地把控到系統(tǒng)接下來的發(fā)展趨勢(shì)和改造方向。
蘑菇街大促峰值的監(jiān)控分兩部分:一部分是實(shí)時(shí)業(yè)務(wù)監(jiān)控,播報(bào)實(shí)時(shí)PV、UV、購買訂單數(shù)、GMV、客單價(jià)的情況,這部分是通過實(shí)時(shí)計(jì)算平臺(tái)的流式計(jì)算任務(wù)來完成的,延遲在秒級(jí)左右;另一部分是實(shí)時(shí)系統(tǒng)監(jiān)控,我們是通過異步上報(bào)、LogAgent收集、實(shí)時(shí)統(tǒng)計(jì)分析來保證10s左右的延遲就能把系統(tǒng)的實(shí)時(shí)統(tǒng)計(jì)指標(biāo)呈現(xiàn)在可視化監(jiān)控平臺(tái)上。前者給業(yè)務(wù)方密切關(guān)注,后者則是我們做大促保障指揮決策、預(yù)案執(zhí)行的哨兵和自動(dòng)化告警的主要手段。
InfoQ:目前蘑菇街的架構(gòu)是否已經(jīng)達(dá)到了“該優(yōu)化的已經(jīng)優(yōu)化了”的階段?您提到“25倍”的優(yōu)化路徑,在您的猜想下,25倍是否是優(yōu)化的極限,您認(rèn)為短期未來還可以達(dá)到多少,如何做到?
七公:蘑菇街業(yè)務(wù)每年都保持3倍多的迅猛增長(zhǎng),對(duì)技術(shù)的挑戰(zhàn)一直非常大。2015年我們主要完成了業(yè)務(wù)應(yīng)用服務(wù)化建設(shè)&服務(wù)架構(gòu)升級(jí)、基礎(chǔ)中間件研發(fā)落地、前后端分離、穩(wěn)定性平臺(tái)建設(shè)&大促保障常態(tài)化等重大技術(shù)改造,為網(wǎng)站架構(gòu)的進(jìn)一步發(fā)展打下了很好的基礎(chǔ)。
目前我們還面臨諸多問題和挑戰(zhàn),比如前端組件化的建設(shè)和新業(yè)務(wù)的快速交付、蘑菇街/美麗說/淘世界整個(gè)集團(tuán)各平臺(tái)業(yè)務(wù)發(fā)展的快速支撐和系統(tǒng)化的穩(wěn)定性保障&質(zhì)量保障能力;JDK8、異步框架等技術(shù)在全站的落地;應(yīng)用高性能的持續(xù)優(yōu)化、虛擬化&私有云的持續(xù)建設(shè)等等,蘑菇街還遠(yuǎn)未到“該優(yōu)化的已經(jīng)優(yōu)化了”的階段。我們要做的就是把每行代碼都寫好、每件事情都做到位,讓我們的系統(tǒng)變的越來越強(qiáng)大,同時(shí)用更少的人力和機(jī)器成本去支持更大體量的業(yè)務(wù)。
關(guān)于優(yōu)化的極限問題,最終追求的極限不是倍數(shù),是在機(jī)器數(shù)上。機(jī)器堆的多了,自然可以支撐更大的流量,但是我們目前在做的是用更少的機(jī)器,支持更多倍的流量。目前我們主要還是進(jìn)一步提高虛級(jí)化占比的方式(已逼近上限)和單機(jī)能力提升(還大有可為)的方式來進(jìn)行的。
InfoQ:為什么您認(rèn)為“根據(jù)場(chǎng)景來選用性能優(yōu)化方案,沒有通用方案”,蘑菇街以前是否考慮過“通用方案”的設(shè)計(jì)?能否結(jié)合蘑菇街架構(gòu)升級(jí)案例談?wù)勥@個(gè)體會(huì)?
七公:性能優(yōu)化有很多種手段:
硬件
對(duì)硬件更新?lián)Q代、提升硬件能力、調(diào)優(yōu)硬件參數(shù)可以提升性能,橫向擴(kuò)展方面加機(jī)器也可以提升性能。
軟件
對(duì)數(shù)據(jù)庫/Web Server等軟件進(jìn)行配置優(yōu)化、對(duì)CPU執(zhí)行效率做優(yōu)化、對(duì)IO效率做優(yōu)化、對(duì)程序CPU計(jì)算復(fù)雜度做優(yōu)化等等都可以提升性能,甚至僅僅做業(yè)務(wù)化簡(jiǎn)也能得到很可觀的RT的降低。
2015年初蘑菇街面臨非常大的性能問題,只能支撐400單左右每秒的交易創(chuàng)建,嚴(yán)重不滿足業(yè)務(wù)超高速發(fā)展和大促迅猛流量的要求。我們?cè)谕瓿上到y(tǒng)拆分&服務(wù)化1.0體系構(gòu)建后,開始了購買鏈路的專項(xiàng)性能提升項(xiàng)目。這個(gè)項(xiàng)目過程中翻越了許多障礙、籬笆,比如DB單點(diǎn)寫瓶頸是一直壓在頭上的一座大山。
我們通過自研分庫分表組件TSharding,完成分庫分表,最終下單服務(wù)支持了寫入的無限水平擴(kuò)展,訂單庫容量提升到了千億級(jí)規(guī)模;營銷服務(wù)的RT不穩(wěn)定,每輪壓測(cè),營銷服務(wù)都能再進(jìn)一步,然后遇到下一個(gè)問題;我們通過SQL優(yōu)化、緩存&預(yù)處理、讀寫分離等手段,大促期間最終計(jì)價(jià)接口RT穩(wěn)定在7ms;異步處理非常有必要性,能大大降低服務(wù)響應(yīng)RT,然后我們通過自己的方式解決異步化后的分布式事務(wù)問題,等等。
我們優(yōu)化的案例還有很多,優(yōu)化的過程很類似:找到瓶頸點(diǎn)——優(yōu)化——壓測(cè)驗(yàn)證然后再循環(huán)。但是最優(yōu)的方案往往都是針對(duì)該場(chǎng)景和問題定制的,不應(yīng)該去追求通用方案,也不會(huì)有通用方案。
InfoQ:并沒有很多技術(shù)人員能有處理海量服務(wù)的機(jī)會(huì),在從事這方面的工作中您有什么特別的感悟或經(jīng)驗(yàn)可以和大家分享嗎?
七公:我的體會(huì)是:只有自己經(jīng)歷過、嘗試過的,才能真正成為自己的。如果有意愿深入接觸高并發(fā)高可用高可擴(kuò)展服務(wù)架構(gòu),但是目前還沒有機(jī)會(huì)的,建議盡早換到業(yè)務(wù)在快速發(fā)展的有大流量場(chǎng)景的互聯(lián)網(wǎng)公司,給自己挑戰(zhàn)自我的機(jī)會(huì)。
七公,原名白輝,2014年以前在阿里巴巴B2B主要負(fù)責(zé)Aliexpress資金中心、評(píng)價(jià)、任務(wù)中心等系統(tǒng)。14年8月離開阿里出國游歷,15年回國后加入蘑菇街,目前在蘑菇街、美麗說、淘世界大集團(tuán)共享的電商基礎(chǔ)平臺(tái)負(fù)責(zé)購物車下單小組及交易平臺(tái)架構(gòu)工作。
聯(lián)系客服