主頁 > 軟體設計 > 京東APP百億級商品與車關系資料檢索實踐

京東APP百億級商品與車關系資料檢索實踐

2023-05-09 08:22:05 軟體設計

導讀

本文主要講解了京東百億級商品車型適配資料存盤結構設計以及怎樣實作適配介面的高性能查詢,通過京東百億級資料快取架構設計實踐案例,簡單剖析了jimdb的位圖(bitmap)函式和lua腳本應用在高性能場景,希望通過本文,讀者可以對快取的內部結構知識有一定了解,并且能夠以最小的記憶體使用代價將位圖(bitmap)靈活應用到各個高性能實際場景,

1.背景

整個汽車行業行特殊性,對于零配件有一個很強的對口特性,不同車使用的零配件(例如:輪胎、機油、三濾、雨刮、火花塞等)規格型號不一樣,在售賣汽車零配件的時候,不能像3C家電、服飾,需要結合用戶具體車輛資訊,推薦適合的配件商品,基于此原因,京東自建人車檔案模型并且利用演算法清洗出百億級的車型-零配件的適配關系資料,最終形成“人->車-〉貨”關系鏈路,解決“人不識貨”的問題, 具體使用場景如下圖:

.

圖1.1京東商詳推薦商品 圖1.2京東加購彈窗推薦商品

2.資料模型

人-> 車->貨”關系的核心鏈路是由人(京東用戶)、乘用車和SKU這三部分組成,

首先,用戶在京東APP的商搜頁、商詳頁多個位置都可以選擇自己的車型資訊進行系結(例如:圖2.1,京東商詳綁車入口位置“+添加愛車”按鈕),建立“人車檔案”資料,

.

圖2.1.京東商詳綁車入口位置 圖2.2.京東商搜綁車入口位置

其次,運營在后臺管理系統中將商品與車型進行系結,建立“商品與車型關系”資料(商品與車型的關系資料量級在百億級別),

最終,購買商品的時候,京東推薦系統可以通過用戶自己系結的車型推薦出適合該車型的商品,具體商品適配車型資料模型,見圖2.3

圖2.3京東商品適配車型資料模型

3.快取結構設計

基于前面兩個部分的介紹,我們可以了解到整個商品搜索適配推薦存在兩個最核心問題,第一、百億級商品適配車型資料的存盤結構設計,盡可能的占用資源成本最小;第二、商詳通過用戶車型來搜索適配商品時,必須保證介面性能的TP99位于毫秒級,最終技術選型的時候,采用了jimdb的位圖(bitmap)函式來進行資料存盤,

3.1位圖(bitmap)結構

位圖(bitmap)是通過最小的單位bit來進行0或者1的設定,表示某個元素對應的值或者狀態,一個bit的值是0或者1;也就是說一個bit能存盤的最多資訊是2,

? 位(bit):計算機內部資料存盤的最小單位,例如:11001100是一個八位二進制數,

? 位元組(byte):計算機中資料處理的基本單位,習慣上用大寫B來表示,1B(byte,位元組)=8bit,

圖3.1位圖(bitmap)內部結構

3.2位圖(bitmap)資料寫流程

位圖(bitmap)是基于jimdb的SDS(簡單動態字串)型別的一系列位操作,遵循jimdb的SDS特性,例如:位圖(bitmap)最大長度512M,最大可以存盤232位,以下是“big”字串的SDS結構示例:

圖3.2.1“big”字串的SDS結構

SDS(簡單動態字串)為了保證性能采用了空間預分配的策略:空間預分配用于優化SDS的字串增長操作,SDS的API對一個SDS進行修改并且需要對SDS進行空間擴展的時候,程式不僅會為SDS分配修改所必須要的空間,還會為SDS分配額外的未使用空,具體預分配流程圖如下:

圖3.2.2SDS預分配流程圖

位置1:創建SDS簡單字串預分配空間為:偏移量/8+1,

位置2:剩余空間不足時,預分配空間流程,

3.3壓縮商品與車關系快取

偏移量(自增ID) 全量車型 商品SKU
1 1165788 101362
2 1165793 101362

商品適配車型關系(百億級資料量)

商品與車關系快取存盤程序中,采用了商品SKU作為KEY,全量車型ID的偏移量(采用偏移量是為降低記憶體消耗)作為VALUE值來進行存盤,

全量車型ID大約有幾十萬的資料量,極限情況下一個商品SKU可以適配幾十萬輛車,很容易造成快取大KEY的問題,為此我們進行了偏移量(全量車型ID對應的自增ID)的分段處理,具體是按照:SKU作為快取KEY的基礎上,追加一個分段標記數字作為新KEY,每個偏移量都會按照分段范圍對應一個分段標記數字,例如:偏移量1~50000,對應快取KEY為SKU+0;偏移量50001~100000,對應快取KEY為SKU+1,其它偏移量以此類推,這樣就保證了一個SKU即使適配所有車輛也不會出現快取大KEY的情況,

BitMap快取結構底層使用SDS簡單字串,為了保證性能采用了預分配空間的策略(圖3.2.2,“快取BitMap內部存盤流程圖”的“位置2”中虛線框圈選),這樣在快取商品與車關系的時候浪費了大量的快取空間,為此我們調整了偏移量存盤順序,首先獲取到需要快取的車型內最大的偏移量,保證同一個快取KEY第1次創建SDS簡單字串(圖3.2.2,“快取BitMap內部存盤流程圖”的“位置1”中虛線框圈選)后,不再進行第2次空間擴容,這樣來最大限度的提升快取利用率,起到壓縮空間目的,快取資料關系流程如下:

圖3.3.1快取資料關系流程

位置3:設定分段最大的偏移量,保證后續新增偏移量不再擴容空間,

位置4:設定分段較小的偏移量,

全量車型ID是定長7位的數字,如果用它作為偏移量將消耗記憶體巨大,所以采用對應自增ID作為偏移量,最終在bitmap快取的商品SKU與車的適配關系快取結構如下圖:

3.3.2商品與車快取結構圖

位置5:spuId用{}括起來表示快取路由(Lua腳本中同一次請求,資料必須在快取同一個分片上,否則會丟失資料),POP商品spuId是SKU的產品ID,自營商品spuId是SKU的MainSkuId,

備注:

1、自營商品MainSkuId可能發生變化,所以我們接入了商品變化MQ訊息,實時調整SKU與車適配關系的存盤位置,

2、京東商詳頁面中每個不同的規格/型號分別對應不同的SKU,但是它們都對應同一個SpuId或者MainSkuId,

4.快取架構設計

商品與車的關系資料量每天都在不斷增長,要求快取架構設計,需要支持集群橫向/縱向擴容和來滿足業務發展以及高可用性,整個快取架構體系主要有前端、京東養車商品與車關系層和存盤三部分組成,

“商品與車關系快取架構”層核心包括:1、“集群路由”層,實作了集群橫向擴容,保證資料量增漲的時候,快取容量也能跟上,2、“分片路由”層,保證搜索的底層資料的分片相同,避免資料丟失,

“存盤”層核心包括:1、實作了快取壓縮,參見3.3壓縮商品與車關系快取,2、單元化實作跨區域災備,保障大促系統穩定性,具體商品與車關系快取架構如下:

4.1商品與車關系快取架構圖

位置6:集群路由,通過商品型別或者商品編號(POP商品)路由到不同快取集群,便于橫向擴展,每個集群單分片限制,解決分片超過限制問題,

位置7:分片路由,保障Lua腳本搜索資料的底層資料集群分片相同,避免資料丟失,其中自營商品和POP商品的路由分別是main_sku_id和product_id,

位置8:自營商品快取集群,單元化實作跨區域災備,采用自研DRC(Data Replication Center)資料同步機制,

位置9:POP商品快取集群,通過商家編號拆分為兩個子集群,

5.高性能搜索

基于BitMap(位圖)快取的商品與車關系資料,商詳呼叫介面的內部實作采用了Lua腳本來降低網路開銷,保障整個介面的性能,以下是搜索介面的流程圖:

5.1商詳搜索商品與車適配關系流程圖

位置10:商詳呼叫介面的時候,要傳兩個引數,第1個引數是全量車型ID串列,大約5個全量車型ID,第2個引數是商品SKU串列,SKU的數量極限超過200個,最后全量車型ID與商品SKU組合為上千個商品與車的關系后,再到百億級適配關系去搜索看是否匹配的,如果不匹配回傳適配商品,反之則回傳不適配,

Lua腳本減少了應用服務器與快取服務器的互動,降低了網路開銷的時間,達到提升搜索服務的性能,以下是Lua腳本具體代碼:

5.2商詳搜索商品與車適配關系Lua代碼

基于以上快取設計和Lua腳本的使用,整個介面T999小于13ms,具體的介面性能監控如下圖:

5.3商詳搜索商品與車適配關系介面性能

6.總結

整個快取結構設計的時候,使用BitMap(位圖)來存盤資料,決議SDS的內部存盤流程,通過存盤流程機制避開預分配空間節點,最大限度的利用快取空間,避免資源浪費,采用Lua腳本來實作資料的適配搜索,降低網路開銷,進一步提升介面的性能,希望此文對大家后續設計類似場景有一定的幫助和啟發,

作者:京東零售 張強

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

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

標籤:架構設計

上一篇:git~分支管理規范

下一篇:返回列表

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

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 京東APP百億級商品與車關系資料檢索實踐

    本文主要講解了京東百億級商品車型適配資料存盤結構設計以及怎樣實作適配介面的高性能查詢。通過京東百億級資料快取架構設計實踐案例,簡單剖析了jimdb的位圖(bitmap)函式和lua腳本應用在高性能場景。希望通過本文,讀者可以對快取的內部結構知識有一定了解,并且能夠以最小的記憶體使用代價將位圖(bitm... ......

    uj5u.com 2023-05-09 08:22:05 more
  • git~分支管理規范

    解決的問題 避免新開發的代碼影響提測的代碼 避免生產環境出現問題后,修復后,由于代碼混亂,無法合并到生產環境 解決多個需求并行開發,并行測驗,合并上線的問題 我的設計思路 流程圖工具我使用的是:diagrams.net 具體執行步驟 開發人員按需求粒度從dev建立分支 哪個需求或者哪些需求提測,就把 ......

    uj5u.com 2023-05-06 09:15:06 more
  • git~分支管理規范

    解決的問題 避免新開發的代碼影響提測的代碼 避免生產環境出現問題后,修復后,由于代碼混亂,無法合并到生產環境 解決多個需求并行開發,并行測驗,合并上線的問題 我的設計思路 流程圖工具我使用的是:diagrams.net 具體執行步驟 開發人員按需求粒度從dev建立分支 哪個需求或者哪些需求提測,就把 ......

    uj5u.com 2023-05-06 09:09:26 more
  • 架構師日記-深入理解軟體設計模式

    本文從設計模式與編程語言的關系,設計模式與架構模式的區別,設計原則和設計模式的關系等幾個維度進行了分析和解答。關于設計模式應該如何學習和應用的問題,給出了學習意見和實踐心得。 ......

    uj5u.com 2023-05-06 08:17:37 more
  • 架構師日記-深入理解軟體設計模式

    本文從設計模式與編程語言的關系,設計模式與架構模式的區別,設計原則和設計模式的關系等幾個維度進行了分析和解答。關于設計模式應該如何學習和應用的問題,給出了學習意見和實踐心得。 ......

    uj5u.com 2023-05-06 08:17:06 more
  • 中臺,真的是一場自欺欺人的騙局嗎?

    前段時間,隨著阿里集團CEO張勇的公開信發布,阿里集團也做出了歷史上最大的一次組織調整。



    隨著新的1+6+N的組織陣型的調整和落地,阿里曾經的中臺戰略,變得有點非常的尷尬了,似乎成為了一個巨大的爭議。 ......

    uj5u.com 2023-05-05 09:41:44 more
  • 抽象工廠模式(Abstract Factory Pattern)

    回顧工廠方法設計模式的不足:具體產品增加時,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度 模式動機 產品等級結構:產品等級結構即產品的繼承結構,即抽象產品與具體產品 產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位于不同產品等級結構中的一組產品 模式定義 提供一個創建一系列相關 ......

    uj5u.com 2023-05-05 09:41:33 more
  • 我設計了個【方案】:比redis好10倍的kv庫【一統kv】

    基于ssd磁盤,此我設計了比redis更好的快取方案。此方案:沒有快取擊穿問題。沒有快取雪崩問題。沒有快取污染問題。沒有熱key問題。
    不需要snap和aof。支持任何sql庫,sql庫不需要帶有任何分布式功能。 ......

    uj5u.com 2023-05-05 09:41:28 more
  • 【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    簡介 訪問者模式(Visitor Pattern)是一種行為型模式。它封裝一個訪問者類,把各元素類的操作集合起來,目的是將資料結構與資料操作分離。在不改變原有元素類資料結構的前提下,改變了元素類的執行演算法。 當某些較為穩定的東西(資料結構或演算法),不想直接被改變但又想擴展功能,這時候適合用訪問者模式 ......

    uj5u.com 2023-05-05 09:41:21 more
  • 抽象工廠模式(Abstract Factory Pattern)

    回顧工廠方法設計模式的不足:具體產品增加時,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度 模式動機 產品等級結構:產品等級結構即產品的繼承結構,即抽象產品與具體產品 產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位于不同產品等級結構中的一組產品 模式定義 提供一個創建一系列相關 ......

    uj5u.com 2023-05-05 09:41:04 more