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

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/05/23/17422566.html
-Advertisement-
Play Games

本文主要介紹在業務複雜化背景下,京東零售購物車團隊努力踐行工匠精神,通過全非同步化改造提升系統性能、提升用戶體驗。通過本文,讀者可以瞭解購物車中台進行全非同步化改造的總體方案,以及方案落地過程中遇到的問題及解決方法,讀者可重點關註文中提到的多分頁並行後,分頁精細控制及底層RPC異常信息問題。 ...


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介面時,只要處在調用拓撲的非關鍵路徑上,對購物車性能沒有太大影響。另外,容量增加時除少數不能分頁調用的介面外,對性能影響已經比較小。

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[es筆記五之term-level的查詢操作](https://mp.weixin.qq.com/s/MiJx-uMTke3zAwVu6-36QA) 官方文檔上寫的是 term-level queries,表義為基於準確值的對文檔的查詢,可以理解 ...
  • 雖然之前弄到過《高中作文範例大全ACCESS資料庫》、《初中作文範例大全ACCESS資料庫》、《小學作文範例大全ACCESS資料庫》、《中考高考作文指導大全ACCESS資料庫》、《中小學生作文大全寶典ACCESS資料庫》等作文資料庫,但是都沒有點評的內容感覺缺少些什麼,而今天這份作文資料庫就較為全面 ...
  • 今天這份作文資料庫是採集自滿分作文網(https://www.zuowenwang.net/)的數據,一共有24萬5千多條,包含大小分類,且段落分明。具體查看截圖,截圖包含所有欄位。 MDB文件有400M,大類包含:小學作文(174075)、初中作文(7110)、高中作文(2267)、其他作文(60 ...
  • 按步驟走,不帶腦子式安裝(註意4.0版本mongodb官方已經不再支持,以下代碼中可以修改mongodb版本號安裝,目前最新版為6.0,如果懶得改直接用也可以,文章後邊第三章第一條代碼會直接升級為最新版本mongodb): **1.導入包管理系統使用的公鑰** ```powershell wget ...
  • 你是否在春節只能複製別人的祝福簡訊來發送?你是否在節日期間為給朋友送祝福無從下手?你是否在特殊日子和朋友打不開對話的開頭?其實,很多情況下我們都需要一堆不同與別的人祝福語,用在節日上、用在交際上等日常備用。今天這一份數據就是祝福語大全,有節日、祝福兩大類,子分類有50多個。 節日大類包含:除夕(22 ...
  • 雖然已經有很多詩詞類的資料庫,最近又再次找了一下古詩詞類的數據,又發現了一些,可是真的是各有各的優點,各有各的特色,之後不再重找詩詞類的數據了。 今天這個詩詞鑒賞數據也不錯,有分類TAG,也有譯文、註釋、品析、朝代,但是又有些不足,詳見下麵說明: 朝代記錄統計:金朝(15)、近代(8)、兩漢(143 ...
  • 這是從一個中藥大全查詢系統中破解提取出來的中藥驗方大全,整理出了數以萬計的各家經方、時方、驗方以及秘方的用藥方劑組成,用法用量以及每組方劑的功效性能、主治應用等。有了這樣一套完善的醫學資料你可以節省很多查閱資料的時間可以更方便快捷的查閱你需要的信息。 加味涼血退斑湯 組成:鮮生地30克,鮮蘆根30克 ...
  • 中國出海中東和北非地區的策略類手游《蘇丹的復仇》(Revenge of Sultans,ROS)和華為HMS生態深度合作,為本地用戶帶來創新游戲體驗,成為當地廣受歡迎的游戲之一,下載量居應用市場前列。2023年5月10日,在阿聯酋迪拜舉辦的HUAWEI P60系列及旗艦產品發佈會中,ONEMT中東G ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...