<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          突發(fā)流量洪峰應(yīng)對(duì)之道——疫情期間京東口罩預(yù)約搶購(gòu)系統(tǒng)優(yōu)化

          共 6330字,需瀏覽 13分鐘

           ·

          2021-01-27 12:29

          編者按

          不起眼的一滴水,融匯在一起可以成為溪流,溪流匯聚成江河,江河最終變成大海。面對(duì)2020年初突然爆發(fā)的疫情,京東技術(shù)人作為抗疫的一份子,在口罩預(yù)約搶購(gòu)上夜以繼日,為了讓更多有效用戶可以買(mǎi)到急需的防疫口罩而奮斗。在2021年初疫情又略有抬頭的今天,回顧以往,更具意義。




          背景



          突如其來(lái)的疫情,讓口罩成為全國(guó)人民爭(zhēng)相搶購(gòu)的必需品。在疫情最嚴(yán)重的2020年2月份,京東組織力量采購(gòu)了一批口罩,面向全國(guó)人民發(fā)售。由于庫(kù)存十分有限,運(yùn)營(yíng)采用了預(yù)約+秒殺的營(yíng)銷模式,也就是用戶先預(yù)約,到了指定時(shí)間才能通過(guò)秒殺系統(tǒng)搶購(gòu)。

          由于大家對(duì)口罩的需求太過(guò)強(qiáng)烈,2月14日活動(dòng)一上線就遭到用戶熱捧,在社交媒體上的熱度急速上升,甚至都上了微博熱搜,造成了一定的社會(huì)影響。而在京東內(nèi)部也升級(jí)為紅色颶風(fēng)事件,客服、公關(guān)等部門(mén)也都介入,為此次活動(dòng)保駕護(hù)航。


          圖1:微博上關(guān)于此次口罩預(yù)約搶購(gòu)的討論

          ? ?

          強(qiáng)烈的用戶需求帶來(lái)了海量的用戶流量,對(duì)相關(guān)系統(tǒng)形成了一定的挑戰(zhàn)。可能有人會(huì)問(wèn),京東經(jīng)歷了這么多次618、11.11大促的考驗(yàn),交易系統(tǒng)經(jīng)歷千錘百煉早就堅(jiān)若磐石了,這次怎么還會(huì)存在挑戰(zhàn)呢?這有兩方面的原因:

          1. 用戶行為與大促不同。618、11.11大促雖然流量大,但流量分布在幾百萬(wàn)sku上;而這次口罩搶購(gòu)則不同,所有用戶都只有一個(gè)目標(biāo),那就是搶口罩,所有流量都集中在特定sku上,形成了超級(jí)爆品。所有人都在瀏覽同一個(gè)sku,然后進(jìn)行預(yù)約、加購(gòu)物車(chē)、最后提交訂單搶購(gòu);而整個(gè)交易流程鏈條非常長(zhǎng),上下游幾十個(gè)系統(tǒng),很容易出現(xiàn)薄弱環(huán)節(jié)造成事故。

          2. 用戶流量遠(yuǎn)超大促。由于用戶行為發(fā)生變化,導(dǎo)致部分接口TPS遠(yuǎn)超歷史極限值。以預(yù)約系統(tǒng)為例:

          ??

          圖2:活動(dòng)期間,預(yù)約系統(tǒng)主要接口TPS峰值

          我們可以看到,單個(gè)sku讀寫(xiě)TPS均遠(yuǎn)超歷史峰值,而寫(xiě)TPS則是歷史峰值的70倍。

          由于這兩點(diǎn)原因,交易系統(tǒng)雖然總體平穩(wěn),但仍存在著不小的挑戰(zhàn)。

          從2020年2月份到4月份期間,我們通過(guò)京東主站、京東健康、京喜等渠道共進(jìn)行了上千場(chǎng)口罩預(yù)約活動(dòng),超過(guò)1億人次進(jìn)行了預(yù)約。為了適應(yīng)新的用戶場(chǎng)景、保障交易系統(tǒng)的平穩(wěn),我們緊急對(duì)相關(guān)系統(tǒng)進(jìn)行了改造,期間遇到了各種突發(fā)狀況和技術(shù)難點(diǎn),所幸的是我們迅速對(duì)系統(tǒng)進(jìn)行了改造,增強(qiáng)了應(yīng)對(duì)突發(fā)流量洪峰的能力,保障了口罩預(yù)約的順利進(jìn)行。在這里以預(yù)約系統(tǒng)為例向大家做一下分享。

          ??



          預(yù)約系統(tǒng)架構(gòu)



          先簡(jiǎn)單介紹一下預(yù)約系統(tǒng)。預(yù)約活動(dòng)分為預(yù)約期和搶購(gòu)期,用戶在預(yù)約期進(jìn)行預(yù)約,搶購(gòu)期開(kāi)始后才能購(gòu)買(mǎi)。


          圖3:預(yù)約活動(dòng)狀態(tài)

          ??

          在預(yù)約期,用戶打開(kāi)商品詳情頁(yè),就會(huì)調(diào)用預(yù)約系統(tǒng)“獲取預(yù)約信息”接口獲取預(yù)約活動(dòng)詳情,比如預(yù)約開(kāi)始時(shí)間、搶購(gòu)開(kāi)始時(shí)間、預(yù)約人數(shù)等,展示在商品詳情頁(yè):

          ??

          圖4:口罩預(yù)約搶購(gòu)商品詳情頁(yè)

          用戶點(diǎn)擊“立即預(yù)約”按鈕,就會(huì)調(diào)用預(yù)約系統(tǒng)的“添加預(yù)約資格”接口,記錄用戶的預(yù)約信息。

          而到了搶購(gòu)期,用戶在結(jié)算頁(yè)點(diǎn)擊“提交訂單”時(shí),會(huì)調(diào)用預(yù)約系統(tǒng)的“校驗(yàn)預(yù)約資格”接口,查看用戶是否進(jìn)行了預(yù)約,如果沒(méi)有預(yù)約就返回錯(cuò)誤不讓用戶下單。

          我們可以看到預(yù)約業(yè)務(wù)相對(duì)簡(jiǎn)單,只有一個(gè)寫(xiě)操作(添加預(yù)約資格)+N個(gè)讀操作,其上下游主要有商詳、購(gòu)物車(chē)、結(jié)算頁(yè)等。

          預(yù)約系統(tǒng)在整個(gè)交易系統(tǒng)中的位置:


          圖5:京東交易系統(tǒng)架構(gòu)示意圖

          ? ?

          最后從技術(shù)角度介紹一下預(yù)約系統(tǒng)整體架構(gòu)。

          ??

          圖6:預(yù)約中臺(tái)架構(gòu)示意圖

          其中“預(yù)約SOA”模塊提供接口給下游系統(tǒng),承接所有的前端流量,在本次活動(dòng)中被重點(diǎn)考驗(yàn)。主要接口有:獲取預(yù)約信息、添加預(yù)約資格、校驗(yàn)預(yù)約資格。存儲(chǔ)用到了緩存jimdb(redis集群)和mysql,redis存儲(chǔ)預(yù)約活動(dòng)信息和用戶的預(yù)約信息,供預(yù)約SOA使用;mysql主要用于數(shù)據(jù)的持久化落地,并不直接提供服務(wù)。我們可以看到,redis作為存儲(chǔ)層,其表現(xiàn)將直接決定預(yù)約系統(tǒng)的性能。

          ??



          Day 1:突發(fā)流量,前方告急



          由于運(yùn)營(yíng)人員沒(méi)有預(yù)料到會(huì)有如此之大的流量,未提前向產(chǎn)品和研發(fā)報(bào)備,只是在活動(dòng)開(kāi)始前通知有一個(gè)口罩預(yù)約活動(dòng),未能引起大家的重視,導(dǎo)致沒(méi)有提前進(jìn)行備戰(zhàn)值班。

          預(yù)約活動(dòng)開(kāi)始后,研發(fā)側(cè)進(jìn)行例行檢查時(shí),發(fā)現(xiàn)口罩預(yù)約活動(dòng)流量異常:每分鐘有數(shù)萬(wàn)人進(jìn)行預(yù)約,而且速度非常穩(wěn)定甚至有加速的趨勢(shì)(隨著消息的傳播,越來(lái)越多的用戶進(jìn)行了預(yù)約)。

          ??

          圖7:口罩預(yù)約活動(dòng)第一天,用戶進(jìn)行預(yù)約調(diào)用次數(shù)監(jiān)控,分鐘級(jí)別

          這個(gè)數(shù)字意味著什么呢?每小時(shí)有幾百萬(wàn)用戶預(yù)約了口罩,此時(shí)距活動(dòng)結(jié)束還有數(shù)小時(shí),如果不采取措施的話,將會(huì)有數(shù)千萬(wàn)人來(lái)預(yù)約這個(gè)口罩!這意味著單個(gè)sku的流量將接近11.11所有預(yù)約sku流量的總和!

          這里暴露出了存在的第一個(gè)問(wèn)題:缺乏對(duì)爆品sku的有效監(jiān)控。雖然我們已經(jīng)對(duì)主要接口的調(diào)用量設(shè)置了監(jiān)控告警,但由于此次活動(dòng)用戶行為與大促不同,并未觸發(fā)系統(tǒng)告警。研發(fā)側(cè)雖然通過(guò)例行檢查及時(shí)發(fā)現(xiàn)了問(wèn)題,但仍存在較大風(fēng)險(xiǎn),后面我們將會(huì)對(duì)此進(jìn)行改進(jìn)。

          由于事先未演練過(guò)如此極端的場(chǎng)景,如此巨大的流量將會(huì)對(duì)預(yù)約系統(tǒng)帶來(lái)怎樣的挑戰(zhàn),大家心里都沒(méi)有底;對(duì)上下游(商詳、購(gòu)物車(chē)、結(jié)算頁(yè))會(huì)造成怎樣的沖擊,更是茫然。此時(shí)我們已經(jīng)看到,流量洪峰即將到來(lái),將對(duì)整個(gè)交易系統(tǒng)帶來(lái)巨大的沖擊。而要想減小沖擊,唯一的辦法就是:提前終止預(yù)約活動(dòng),將流量擋在交易系統(tǒng)之前。

          發(fā)現(xiàn)問(wèn)題的嚴(yán)重性后,研發(fā)側(cè)立即將問(wèn)題升級(jí)上報(bào),迅速聯(lián)系產(chǎn)品、上下游系統(tǒng)和業(yè)務(wù)方,提出預(yù)約系統(tǒng)的建議:立即結(jié)束預(yù)約活動(dòng)。經(jīng)過(guò)緊急溝通后,業(yè)務(wù)方考慮到口罩庫(kù)存有限,最終同意了我們的建議,但要求已預(yù)約的所有用戶能正常參與搶購(gòu)。

          在按下“關(guān)閉預(yù)約”按鈕的那一刻,看著新增預(yù)約人數(shù)斷崖式下滑,所有人都松了一口氣。但大家來(lái)不及放松,因?yàn)榇藭r(shí)整個(gè)交易系統(tǒng)面臨著一系列棘手問(wèn)題:

          1. 預(yù)約系統(tǒng):上一場(chǎng)預(yù)約活動(dòng)已經(jīng)提前結(jié)束,已經(jīng)預(yù)約的數(shù)百萬(wàn)用戶必須讓他們正常搶購(gòu)口罩。如果到了時(shí)間不能購(gòu)買(mǎi),必將引起這數(shù)百萬(wàn)用戶的集中投訴,將會(huì)是P0級(jí)別的嚴(yán)重事故。

          2. 購(gòu)物車(chē):預(yù)約活動(dòng)有個(gè)選項(xiàng)叫“自動(dòng)加購(gòu)物車(chē)”,用戶預(yù)約成功后會(huì)自動(dòng)將sku添加到購(gòu)物車(chē),方便下單購(gòu)買(mǎi)。運(yùn)營(yíng)人員沒(méi)有預(yù)計(jì)到會(huì)有如此多的用戶進(jìn)行預(yù)約,在創(chuàng)建預(yù)約活動(dòng)時(shí)配置了該選項(xiàng),導(dǎo)致這數(shù)百萬(wàn)用戶都將口罩添加到了購(gòu)物車(chē)。在搶購(gòu)開(kāi)始前,大量用戶將從購(gòu)物車(chē)入口提交訂單進(jìn)行搶購(gòu),對(duì)購(gòu)物車(chē)系統(tǒng)將會(huì)造成非常大的沖擊。

          3. 商品詳情:除了從購(gòu)物車(chē)入口進(jìn)行搶購(gòu)?fù)猓€有大量用戶直接從商詳頁(yè)提交訂單,如此大的流量訪問(wèn)同一個(gè)sku將會(huì)造成嚴(yán)重的熱點(diǎn)key問(wèn)題,在用戶端的表現(xiàn)就是商詳頁(yè)面卡、白屏等,嚴(yán)重影響用戶體驗(yàn)。

          4. 結(jié)算頁(yè):有兩套下單系統(tǒng),主流程(日常下單系統(tǒng))和獨(dú)立秒殺系統(tǒng)(應(yīng)對(duì)突發(fā)流量的搶購(gòu)系統(tǒng))。運(yùn)營(yíng)人員沒(méi)有為口罩sku創(chuàng)建獨(dú)立秒殺活動(dòng),用戶下單時(shí)將會(huì)走主流程提交訂單,將會(huì)嚴(yán)重影響主流程的性能。

          此時(shí)距搶購(gòu)開(kāi)始時(shí)間只有幾小時(shí),研發(fā)側(cè)必須在搶購(gòu)開(kāi)始前解決以上問(wèn)題。

          考慮到時(shí)間的緊迫性,研發(fā)側(cè)最終采取了如下措施應(yīng)對(duì)緊急情況,確保用戶能正常搶購(gòu):

          1. 預(yù)約系統(tǒng):?jiǎn)⒂昧藨?yīng)急方案,同一個(gè)口罩sku新建一個(gè)只有搶購(gòu)期預(yù)約活動(dòng),然后將上一場(chǎng)預(yù)約活動(dòng)的數(shù)百萬(wàn)用戶導(dǎo)入進(jìn)來(lái)(相當(dāng)于替這數(shù)百萬(wàn)用戶預(yù)約了新建的這一場(chǎng)預(yù)約活動(dòng),用戶側(cè)無(wú)感知),到了搶購(gòu)時(shí)間這些用戶就能正常參與搶購(gòu)了。這樣既能讓這批用戶參與搶購(gòu),又不讓新用戶繼續(xù)預(yù)約,達(dá)到了保護(hù)交易系統(tǒng)的目的。


          圖8:預(yù)約活動(dòng)提前結(jié)束后,用戶進(jìn)行預(yù)約調(diào)用次數(shù)監(jiān)控,分鐘級(jí)別


          但在導(dǎo)入用戶時(shí),我們遇到了第二個(gè)問(wèn)題:查詢Mysql用戶表遍歷數(shù)百萬(wàn)用戶,Mysql分頁(yè)查詢速度越來(lái)越慢,導(dǎo)致用戶導(dǎo)入速度越來(lái)越慢。這是Mysql經(jīng)常遇到的經(jīng)典問(wèn)題,雖然我們已經(jīng)做了常規(guī)的SQL優(yōu)化,但查詢速度仍然達(dá)不到要求。我們查詢SQL如下:


          SELECT ...FROM MEMBER_TABLE ainner join (  SELECT id as id1  FROM MEMBER_TABLE  WHERE ...  LIMIT #{page.beginIndex},#{page.step}) b ON a.id=b.id1


          所幸的是,雖然查詢速度較慢,但仍在搶購(gòu)開(kāi)始前將所有預(yù)約用戶成功導(dǎo)入到下一場(chǎng)預(yù)約活動(dòng)了,讓他們可以正常參與搶購(gòu)。關(guān)于這個(gè)問(wèn)題的最終解決方案,我們將在后面做介紹。

          2. 購(gòu)物車(chē):進(jìn)行緊急處理避免了問(wèn)題。

          3. 商品詳情:服務(wù)降級(jí)+緩存擴(kuò)容解決熱點(diǎn)key問(wèn)題。

          4. 結(jié)算頁(yè):為口罩sku創(chuàng)建獨(dú)立秒殺活動(dòng),用戶提交訂單時(shí)走獨(dú)立秒殺系統(tǒng),保護(hù)了下單主流程。

          經(jīng)過(guò)各系統(tǒng)的一系列應(yīng)急處理,我們終于在搶購(gòu)開(kāi)始前做好了準(zhǔn)備工作,在搶購(gòu)開(kāi)始的那一刻看著蜂擁而來(lái)的用戶請(qǐng)求,所有人懸著的心終于暫時(shí)放了下來(lái)。

          然第一天的預(yù)約活動(dòng)順利進(jìn)行了,但暴露出了第三個(gè)問(wèn)題預(yù)約系統(tǒng)缺乏熔斷機(jī)制。在之前多年的營(yíng)銷活動(dòng)中,都沒(méi)有出現(xiàn)過(guò)上百萬(wàn)人預(yù)約同一個(gè)sku的場(chǎng)景,因此并未對(duì)預(yù)約人數(shù)設(shè)置上限。但是在當(dāng)前場(chǎng)景下,我們急需限制預(yù)約人數(shù)上限,因此需要增加熔斷機(jī)制。按照正常的方案溝通、開(kāi)發(fā)、測(cè)試、上線流程,至少需要一個(gè)禮拜才能完成上述功能,而此時(shí)距下場(chǎng)預(yù)約活動(dòng)開(kāi)始,只剩不到12個(gè)小時(shí)的時(shí)間。

          ??



          Day 2:熔斷機(jī)制



          所謂的熔斷機(jī)制,就是在用戶點(diǎn)擊“立即預(yù)約”時(shí),檢查預(yù)約人數(shù)是否達(dá)到指定上限,如果到了就立即結(jié)束預(yù)約期不讓新用戶進(jìn)行預(yù)約,預(yù)約活動(dòng)進(jìn)入“等待搶購(gòu)”狀態(tài),已預(yù)約的用戶等搶購(gòu)開(kāi)始后可以正常參與搶購(gòu)。也就是圖4中,將預(yù)約結(jié)束時(shí)間提前。

          簡(jiǎn)化版流程圖如下:


          圖9:用戶立即預(yù)約流程圖(灰色部分為熔斷機(jī)制)

          方案看起來(lái)相對(duì)簡(jiǎn)單,但實(shí)際開(kāi)發(fā)時(shí)有諸多細(xì)節(jié)需要考慮,這里就不一一講解了。

          熔斷機(jī)制上線后,每場(chǎng)活動(dòng)的預(yù)約人數(shù)基本都控制在固定數(shù)字,爆品流量得到了控制,有效的保護(hù)了整個(gè)交易系統(tǒng)。但又引發(fā)了意料之外的第四個(gè)問(wèn)題:熱key問(wèn)題。

          ??



          Day 3:熱key問(wèn)題



          意想不到的是,熔斷機(jī)制上線后用戶的行為發(fā)生了很大的變化:所有用戶都在預(yù)約期開(kāi)始的第一秒進(jìn)行預(yù)約,因?yàn)樗杏脩舳贾李A(yù)約人數(shù)達(dá)到上限后,就不能再預(yù)約了。這無(wú)形之中起到了流量聚集的作用,本來(lái)用戶點(diǎn)“立即預(yù)約”的流量分布比較均勻,現(xiàn)在都搶在第一秒點(diǎn)擊,于是就造成預(yù)約系統(tǒng)“添加預(yù)約資格”接口TPS飆升,達(dá)到了歷史峰值的70倍(某種意義上來(lái)說(shuō),預(yù)約系統(tǒng)已經(jīng)變成了秒殺系統(tǒng),用戶點(diǎn)擊“立即預(yù)約”實(shí)際就是在進(jìn)行秒殺搶購(gòu))。


          圖10:熔斷機(jī)制上線后,用戶添加預(yù)約調(diào)用量監(jiān)控,分鐘級(jí)

          ??

          而“添加預(yù)約資格”接口需要多次寫(xiě)redis緩存,如此高的TPS帶來(lái)了嚴(yán)重的問(wèn)題:熱key問(wèn)題。

          預(yù)約系統(tǒng)經(jīng)歷多年618、11.11大促的考驗(yàn),常規(guī)場(chǎng)景下的熱key問(wèn)題早就解決了。但是很不幸,新場(chǎng)景下還是出現(xiàn)了新的熱key問(wèn)題。下面詳細(xì)講解為啥會(huì)出現(xiàn)熱key問(wèn)題,以及我們的解決方案。

          預(yù)約系統(tǒng)使用了2個(gè)redis集群(實(shí)際部署情況更復(fù)雜,這里簡(jiǎn)化處理了):

          1. SKU集群:存放預(yù)約活動(dòng)信息,M個(gè)分片,1主多從,寫(xiě)操作主實(shí)例,讀操作從實(shí)例。

          2. USER集群:存放用戶的預(yù)約記錄,N個(gè)分片,1主多從,寫(xiě)操作主實(shí)例,讀操作從實(shí)例。


          圖11:SKU集群架構(gòu)

          圖12:USER集群架構(gòu)

          “添加預(yù)約資格”接口流程圖如下:


          圖13:“添加預(yù)約資格”接口流程圖

          從上面的流程圖可以看到,用戶在“立即預(yù)約”時(shí),將要對(duì)USER集群進(jìn)行2次寫(xiě)操作,對(duì)SKU集群進(jìn)行1次讀操作+1次寫(xiě)操作。下面我們一一分析:

          1. 查詢預(yù)約活動(dòng)信息時(shí)讀SKU集群,key為SKU_{skuid}。在爆品sku的情況下可能形成熱點(diǎn)key,但實(shí)際上并未發(fā)生,因?yàn)檫M(jìn)行了如下優(yōu)化:

          1. 本地JVM緩存。因?yàn)镾KU活動(dòng)信息很少發(fā)生變化,于是使用了guava進(jìn)行了本次緩存,只有在guava緩存失效的情況下才會(huì)讀取redis集群。根據(jù)線上監(jiān)控?cái)?shù)據(jù),爆品活動(dòng)的緩存命中率在99%以上,因此極大的降低了讀redis集群的OPS。

          2. SKU集群1主多從,讀操作流量由個(gè)從庫(kù)平均分?jǐn)偅材軕?yīng)付很高的TPS。

          2. 寫(xiě)用戶資格緩存時(shí)寫(xiě)USER集群,key為USERPIN{userpin},用戶維度的key分布在多個(gè)redis分片上,理論上能承受很高的OPS,也足以應(yīng)付本場(chǎng)景。

          3. 寫(xiě)用戶預(yù)約列表緩存,同上。

          4. 更新預(yù)約活動(dòng)的預(yù)約人數(shù),寫(xiě)SKU集群,key為COUNT_{skuid}。本操作主要是更新預(yù)約人數(shù)計(jì)數(shù)器,就是用戶在商品詳情頁(yè)面看到當(dāng)前有多少人預(yù)約了這個(gè)sku。該計(jì)數(shù)器是實(shí)時(shí)更新的,每一個(gè)新用戶預(yù)約成功,該計(jì)數(shù)器就會(huì)+1;假設(shè)添加預(yù)約資格TPS為X萬(wàn),那么寫(xiě)redis的OPS就為X萬(wàn),所有寫(xiě)操作都打到一個(gè)分片的主庫(kù)上,于是就形成了熱點(diǎn)key。

          熱點(diǎn)key直接將USER集群一個(gè)主庫(kù)的CPU打到100%,造成大量寫(xiě)操作超時(shí),進(jìn)而導(dǎo)致“添加預(yù)約資格”接口TP飆升,可用率下降。反映在用戶端就是,大量用戶點(diǎn)擊“立即預(yù)約”時(shí),會(huì)收到預(yù)約失敗的提示,嚴(yán)重影響用戶體驗(yàn)。


          圖14:熱key問(wèn)題發(fā)生時(shí),添加預(yù)約資格接口TP,分鐘級(jí)

          ??

          找到了熱key發(fā)生的原因,解決方案就在眼前了:減少寫(xiě)USER集群的次數(shù),把OPS降下來(lái)問(wèn)題自然就迎刃而解了。

          我們采取的方案是:不再實(shí)時(shí)更新預(yù)約人數(shù),而是在JVM中先緩存預(yù)約人數(shù),達(dá)到一定閾值后再批量更新預(yù)約人數(shù)計(jì)數(shù)器。原來(lái)是每次加1,改為每次加N,自然就把寫(xiě)操作的OPS降下來(lái)了。

          本方案通過(guò)犧牲預(yù)約人數(shù)計(jì)數(shù)器的精確性,來(lái)保證接口的整體性能,得到了業(yè)務(wù)方的認(rèn)可。具體流程圖如下:


          圖15:批量更新預(yù)約人數(shù)計(jì)數(shù)器

          經(jīng)過(guò)本次優(yōu)化,終于解決了熱點(diǎn)key問(wèn)題,USER集群OPS降低到原來(lái)的2%, cpu使用率從100%降低了13%,接口TP999提升了500倍。

          然后再啟用JSF限流,限制“添加預(yù)約資格”接口的TPS,有效的解決了此問(wèn)題。


          圖16:限流后,添加預(yù)約資格接口TPS(雙機(jī)房流量),秒級(jí)

          ??



          總結(jié) &后續(xù)改進(jìn)



          最后,簡(jiǎn)單總結(jié)一下在此期間遇到的典型問(wèn)題以及解決方案:

          1. 爆品sku缺乏監(jiān)控:預(yù)約系統(tǒng)新增了監(jiān)控機(jī)制,定期掃描每個(gè)活動(dòng)的預(yù)約人數(shù),發(fā)現(xiàn)爆品sku通過(guò)郵件發(fā)送上下游系統(tǒng),提醒他們做好值班保障;同時(shí)還通過(guò)電話語(yǔ)音告警,通知預(yù)約系統(tǒng)值班人員。

          2. mysql查詢慢:從mysql遷移到彈性數(shù)據(jù)庫(kù)JED,同時(shí)對(duì)部分場(chǎng)景進(jìn)行改造:預(yù)約人數(shù)較多的活動(dòng),查詢r(jià)edis集群獲取所有用戶pin,不再?gòu)臄?shù)據(jù)庫(kù)中查詢。

          3. 預(yù)約人數(shù)過(guò)多:熔斷機(jī)制。

          4. 熱key問(wèn)題:批量更新預(yù)約人數(shù)計(jì)數(shù)器,減少寫(xiě)redis集群的OPS。

          5. 公平性問(wèn)題:由于口罩庫(kù)存有限,大量預(yù)約用戶搶購(gòu)失敗,嚴(yán)重影響用戶體驗(yàn)。針對(duì)此類稀缺爆品,我們開(kāi)發(fā)了預(yù)約抽簽?zāi)J剑河脩粝阮A(yù)約,然后系統(tǒng)進(jìn)行抽簽搖號(hào),只有中簽用戶才能購(gòu)買(mǎi),這里就先不介紹了。

          通過(guò)如上一系列緊急改造,預(yù)約系統(tǒng)具備了應(yīng)對(duì)突發(fā)流量洪峰的能力,達(dá)到了平穩(wěn)運(yùn)行、有效保護(hù)交易系統(tǒng)的目的。不僅順利進(jìn)行了上千場(chǎng)口罩預(yù)約搶購(gòu)活動(dòng),為部分用戶送去了他們急需的口罩;這些改造還直接應(yīng)用在了2020年下半年的茅臺(tái)預(yù)約搶購(gòu)、京東PLUS盛典等重大活動(dòng)中,有力的支撐了業(yè)務(wù)發(fā)展。

          作為的親歷此次備戰(zhàn)的一線研發(fā)人員,能用實(shí)際行動(dòng)在疫情期間為全國(guó)人民做出一點(diǎn)微小的貢獻(xiàn),我們內(nèi)心感到無(wú)比的高興和光榮。

          ? ?

          此次口罩預(yù)約搶購(gòu)活動(dòng),預(yù)約中臺(tái)保障人員:架構(gòu)師王曉烽、佘志東、王曦晨、產(chǎn)品童春斐、工程師饒正鋒


          后臺(tái)回復(fù)?學(xué)習(xí)資料?領(lǐng)取學(xué)習(xí)視頻


          如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝

          瀏覽 85
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰天天日日干干夜夜 | 国产毛片毛片 | 成人在线免费网址 | 色四月婷婷网五月天 | 日韩一区二区三区四区五区六区 |