京東購物車如何提升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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...