主頁 > 移動端開發 > 京東購物車如何提升30%性能

京東購物車如何提升30%性能

2023-05-23 13:12:04 移動端開發

1、背景

購物車面臨的挑戰:

1)新業務:隨著業務形態的豐富,購物車在不斷支持各種新業務,依賴的外部介面也隨之增加;

2)下沉:一些前端呼叫的介面下沉到購物車中臺;

3)前置:結算流程很多業務前置到購物車中,如優惠券、京豆;

4)擴容:為改善用戶體驗購物車可容納的商品數量在不斷增長;

這些導致購物車依賴的RPC介面數量及分頁呼叫次數都在不斷增加,購物車作為交易流程開端,本身流量較大,在業務復雜化的背景下,如何提高性能保證用戶體驗,成為購物車面臨的較大挑戰,

2、全異步化改造方案

通過增加服務器資源雖然能在一定程度上解決問題,但會帶來較大的成本開銷,也與工匠精神相悖,能否通過技術手段提升性能呢?通過分析,異步化改造成為解決這一問題的有效手段,

1)不同RPC并行

購物車依賴介面達幾十個,各介面間存在復雜依賴關系,必須先梳理各介面間依賴,識別哪些可以并行,然后將原有代碼拆分為兩部分:RPC異步請求和結果處理,按照依賴關系,讓RPC最大限度并行執行,減少在結果處理階段異步回應等待時間,從而達到提升性能的目的,

2)批量介面多分頁并行

購物車依賴介面多為批量介面,且單次呼叫有資料量限制,需將資料拆分為多個分頁呼叫,那么多個分頁間也可以并行,改造中封裝了異步分頁工具,使業務層對分頁邏輯無感知,異步工具自動將超過介面上限的資料拆分為多個分頁并行呼叫,提升單介面回應速度,

3)底層采用JSF異步呼叫

異步呼叫基于京東RPC框架JSF,推薦使用1.7.5以后版本,支持CompletableFuture,

3、問題及解決

異步化改造的總體方案并不復雜,但是在實際落地程序中,遇到了很多細節問題:

1)例外重試需精細化

同步呼叫時,如果超時會重新呼叫,改為異步后重試會失效,因為在呼叫時一般不會報錯,需要在結果處理階段獲取異步回應超時后,再進行重試,

另外,多分頁并行時,當某一頁請求超時后,應該只重試出錯的分頁,底層對分頁呼叫進行了封裝,上層業務代碼在獲取資料時無法感知是哪一頁超時,所以必須在異步呼叫時將現場資訊保存在包裝類中,一起回傳給業務層,在Get資料超時后,單獨重試出錯的分頁,

發生例外時,并不是所有情況都需要重試,當遇到限流等例外時,不能進行重試,底層工具需要自動過濾限流例外,當然也支持自定義規則,

2)異步RPC監控更復雜

底層RPC耗時監控需要拆分為兩部分,在分頁呼叫時記為開始時間,在異步結果到達后,記為結束時間,如果呼叫例外或Get超時,需要標記本次呼叫失敗,對于重試同樣需要記錄呼叫耗時,且正常呼叫與重試呼叫需分開記錄,

除了需要監控RPC耗時外,還需要監控結果處理階段Get等待時長,這個時間才是真正對應用性能有影響的時間,由于底層是分頁呼叫,所以業務呼叫次數和底層RPC呼叫次數并不相同,

3)分頁異步結果不能合并,否則無法獲取例外Provider資訊

底層異步呼叫結果,必須通過包裝類原樣回傳給上層,除了上邊提到的需要單分頁重試外,另一個原因是必須保留異步結果,在分頁超時后才能輸出超時的Provider資訊,這是由于Provider資訊依賴JSF框架的JSFCompletableFuture,如果在底層合并結果,會導致資訊丟失,

4)每頁超時時間需單獨控制

分頁呼叫程序如上圖所示,在結果處理時,每頁Get超時時間需要單獨控制,因為獲取結果是順序進行,獲取后邊的分頁時,前邊分頁等待的時間也應計算在內,以保證整個獲取結果的時間不超過單個分頁的最大超時時間,計算公式如下:

超時=RPC超時時間 > (當前時間-異步呼叫開始時間) ? RPC超時時間 – (當前時間-異步呼叫開始時間) : 0

5)分頁均衡

為避免最后一頁資料過少造成資料傾斜,需要將請求資料均分到每一頁,以最大限度提高整個請求的性能,

4、收益

改造完成后購物車核心介面耗時減少30%,保證用戶體驗,節省大量服務器資源,后續增加新的RPC介面時,只要處在呼叫拓撲的非關鍵路徑上,對購物車性能沒有太大影響,另外,容量增加時除少數不能分頁呼叫的介面外,對性能影響已經比較小,

作者:京東零售 王利輝 梁奉龍

內容來源:京東云開發者社區

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/553181.html

標籤:其他

上一篇:關于微信小程式原生組件與uniApp混合開發程序遇到的問題與解決方式

下一篇:返回列表

標籤雲
其他(159542) Python(38162) JavaScript(25444) Java(18101) C(15231) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7207) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4575) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1941) C++(1920) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 京東購物車如何提升30%性能

    本文主要介紹在業務復雜化背景下,京東零售購物車團隊努力踐行工匠精神,通過全異步化改造提升系統性能、提升用戶體驗。通過本文,讀者可以了解購物車中臺進行全異步化改造的總體方案,以及方案落地程序中遇到的問題及解決方法,讀者可重點關注文中提到的多分頁并行后,分頁精細控制及底層RPC例外資訊問題。 ......

    uj5u.com 2023-05-23 13:12:04 more
  • 關于微信小程式原生組件與uniApp混合開發程序遇到的問題與解決方

    前言: 在實際開發程序中,尤其是小程式的開發,我們常常會遇到一些在檔案中解決不了的問題,在這里,我就淺談一下我遇到的一些問題 1.小程式的構建框架是uni-app,卻突然被要求用原生的微信小程式代碼來開發,到最后要整合到uni-app里面 這個整合問題,uni-app官網就有解決方式,這里就不多說, ......

    uj5u.com 2023-05-23 10:18:21 more
  • 從熱愛到深耕,在開發路上的他們勇敢逐夢

    2022年的程式員節, #大齡程式員去哪兒了#成為了社交媒體上最火的話題之一,程式員的職場成長問題在社會上引起了廣泛關注。 有2位在技術領域摸爬滾打很多年的開發者,35歲后的他們,有70后,有80后,依然在編程開發,依然有離職創業的勇氣,努力實作自己的人生價值。走進他們的故事,你會發現,這個世上沒有 ......

    uj5u.com 2023-05-23 10:18:13 more
  • 從熱愛到深耕,在開發路上的他們勇敢逐夢

    2022年的程式員節, #大齡程式員去哪兒了#成為了社交媒體上最火的話題之一,程式員的職場成長問題在社會上引起了廣泛關注。 有2位在技術領域摸爬滾打很多年的開發者,35歲后的他們,有70后,有80后,依然在編程開發,依然有離職創業的勇氣,努力實作自己的人生價值。走進他們的故事,你會發現,這個世上沒有 ......

    uj5u.com 2023-05-23 10:17:45 more
  • From Java To Kotlin:空安全、擴展、函式、Lambda很詳細,這次終于

    From Java To Kotlin, 空安全、擴展、函式、Lambda 概述(Summarize) * ? Kotlin 是什么? * ? 可以做什么? * ? Android 官方開發語言從Java變為Kotlin,Java 有哪些問題? * ? Kotlin的優點 * ? Kotlin 特性 ......

    uj5u.com 2023-05-21 07:59:43 more
  • From Java To Kotlin:空安全、擴展、函式、Lambda很詳細,這次終于

    From Java To Kotlin, 空安全、擴展、函式、Lambda 概述(Summarize) * ? Kotlin 是什么? * ? 可以做什么? * ? Android 官方開發語言從Java變為Kotlin,Java 有哪些問題? * ? Kotlin的優點 * ? Kotlin 特性 ......

    uj5u.com 2023-05-21 07:59:20 more
  • 我所知道的Handler

    簡單講,handler就是兩個功能 插入訊息,enqueuemessage,msg,when 從訊息佇列中遍歷所有訊息,比對msg.when和當前的when,找到合適的位置插入 處理訊息,looper.loop會從messagequeue中呼叫next。取訊息,如果訊息還沒到時間該執行,就會比對時間 ......

    uj5u.com 2023-05-18 09:03:42 more
  • 我所知道的Handler

    簡單講,handler就是兩個功能 插入訊息,enqueuemessage,msg,when 從訊息佇列中遍歷所有訊息,比對msg.when和當前的when,找到合適的位置插入 處理訊息,looper.loop會從messagequeue中呼叫next。取訊息,如果訊息還沒到時間該執行,就會比對時間 ......

    uj5u.com 2023-05-18 09:03:21 more
  • 這么分析大檔案日志,以后就不用加班卷了!

    有沒有熟悉這樣的場景: 時間已過十一點,空蕩蕩的辦公室只剩自己孤身一人。陪你伏案忙碌的只有電腦風扇被迫營業的“嗡嗡”聲, 窗外的夜正黑得帶勁,仿佛巨獸的口吞噬自己的無奈。 天性善良不善言辭的你,容易被人頤指氣使,加班對你來說是家常便飯。 作為一名碼農,“我到底哪里錯了,我需要怎么解決?”是我的座右銘 ......

    uj5u.com 2023-05-17 08:01:18 more
  • 跑步課程匯入能力,助力科學訓練

    HUAWEI Health Kit為開發者提供用戶自定義的跑步課程匯入介面,便于用戶在華為運動健康App和華為智能穿戴設備上查看來自生態應用的訓練課表,開啟科學、適度的運動訓練。 跑步課程匯入能力支持生態應用在獲取用戶的華為帳號授權后,將跑步課程資料寫入至華為運動健康App,并在已有的華為智能穿戴設 ......

    uj5u.com 2023-05-12 10:43:01 more