使用 ChronicleMap 擴展高性能內存緩存

1.擴展內存緩存的挑戰

我們用于與各種程序化和需求方平臺 (DSP) 集成的應用程序之一是低延遲、高吞吐量的基于 JVM 的應用程序。這是 付款憑單(DV)付前前驗證解決方案的核心組件。自多年前成功推出此解決方案以來,我們不斷添加多項關鍵功能,同時保持嚴格的延遲 SLA 并每天處理數千億個請求。

近年來,用于投標前評估的測量數據(欺詐、品牌安全等)的大小大幅增長。隨著數據集的增長,我們的內存緩存的大小也在增長。有一次,我們面臨著一個關鍵挑戰,即擴展我們最大的內存緩存以支持可能將我們的緩存大小增加四倍的新功能發布。我們有嚴格的低延遲響應 SLA??、要支持的各種部署選項,以及低于 32GB 的有限 JVM 分配以使用壓縮對象指針。在評估了幾個選項后,我們決定使用 Chronicle Software 的開源 ChronicleMap 作為我們的解決方案。

在這篇博文中,我將討論我們評估各種開源和企業解決方案的過程,以及我們最終選擇 ChronicleMap 的原因。我還將分享我們的最佳實踐和經驗教訓。

2.當前的問題

由于上述原因,我們現有的緩存解決方案無法處理增加的工作負載,因此我們需要一種可以擴展且仍能滿足嚴格的延遲和部署要求的新解決方案。該應用程序服務于兩種主要類型的競價前集成:— (1) 緩存解決方案,DSP 在其終端緩存我們的響應,因此沒有嚴格的延遲要求;(2) 其他集成,相比之下,它們使用實時競價流響應,要求端到端延遲小于 10 毫秒。

此應用程序需要在 付款憑單(DV)、云端甚至我們一些合作伙伴的本地托管,以使要求更加嚴格。我們可能擁有多個版本的應用程序,但決定只使用一個版本,以降低部署和維護的復雜性、我們的發布管道和可維護性。因此,我們選擇的任何解決方案都需要符合上述要求。我們評估了幾個選項,以找到最適合我們需求的選項。

3.評估各種開源和企業解決方案

為了找到滿足我們要求的解決方案,我們評估了幾種開源和企業選項,包括:

  • Redis — 一種流行的開源內存鍵值數據存儲。
  • EhCache — 一種廣泛使用的開源 Java 緩存。
  • Aerospike — 一種支持高吞吐量、低延遲緩存的企業級分布式緩存解決方案。
  • Hazelcast — 一種用于分布式計算和內存緩存的開源解決方案。
  • ChronicleMap — 一種專為低延遲和/或多進程應用程序設計的內存鍵值存儲。

4.為什么我們決定使用 ChronicleMap?

我們研究并評估了上述選項的優點和局限性。雖然每種方案都有其優點,但我們需要針對我們獨特的需求組合而制定非常具體的方法。

我們排除了需要進行進程外查找的任何解決方案,因為與訪問本地 RAM 的速度相比,完成查找需要額外的時間。

這可能會破壞我們 10 毫秒的整體端到端延遲要求。此外,在每個地區為這些解決方案創建服務器集群會給我們增加大量的維護和基礎設施成本開銷,更重要的是,也會給托管我們應用程序的本地合作伙伴增加成本開銷。因此,我們排除了 Redis 和 Aerospike。

雖然 Terracotta 的 EhCache 似乎為較小的緩存提供了良好的性能,但由于其在擴展大型緩存方面的局限性以及開源版本不支持堆外存儲,它并不適合我們的需求。Terracotta 的堆外存儲解決方案 BigMemory 僅作為商業解決方案提供。

Hazelcast 表現出良好的性能和可擴展性,但需要進行大量配置和調整才能實現最佳性能。此外,Hazelcast 的堆外解決方案高密度存儲僅在商業上可用。

相比之下,ChronicleMap 脫穎而出,成為最適合我們需求的解決方案,因為它滿足了我們的核心要求。

  • 它針對低垃圾收集進行了優化,并提供高性能數據存儲、檢索和迭代。
  • 它可以作為我們應用程序的一部分實施,使我們能夠保持部署簡單,而無需為外部緩存維護單獨的服務器集群。
  • 它被實現為內存中的堆外解決方案,可以使用磁盤進一步擴展。由于它是堆外的,- 我們可以擴展內存緩存,同時將應用程序的堆內內存分配保持在 32GB 以下。
  • 開源版本中提供的功能似乎足以滿足我們的要求 - 主要是內存、堆外映射和持久化到磁盤,以實現快速應用程序重啟。

我們還發現,ChronicleMap 在全球銀行和對沖基金的生產中被廣泛使用,它們必須處理與 付款憑單(DV) 類似的規模。我們覺得它很合適。我們實施了概念驗證 (POC),結果令人鼓舞。此時,我們對選擇 ChronicleMap 來擴展我們的內存緩存充滿信心。

5.經驗和最佳實踐

隨著數據集的增長,我們能夠擴展內存緩存,而不會犧牲低延遲響應時間。

以下是我們通過利用 ChronicleMap 提供的一些功能在應用程序中看到的顯著改進:

  • 縮放數據集的能力。在我們成功將頁面分類類別移至堆外緩存并啟動依賴于擴展的功能后,我們開始遷移其他數據集。與原始 HashMap 的查找延遲相比,ChronicleMap 緩存的查找延遲增加了可忽略不計的額外時間(納秒)。我們最終能夠支持在需要時按多個因子擴展每個數據集,這是一個巨大的好處。
  • 改進的垃圾收集。在將許多數據集移至 ChronicleMap 后,我們注意到垃圾收集減少方面取得了顯著進步。由于堆上的大部分內存被移至堆外,JVM 內存占用減少導致垃圾收集周期更少且速度更快。
  • 提高代碼可維護性。在使用 ChronicleMap 之前,我們必須為每個內存緩存維護兩個副本。一個是用于處理 API 請求的“主動”緩存,另一個是用于數據更新的“被動”緩存。由于應用程序使用無鎖算法來降低延遲,因此我們需要保留單獨的緩存,并在每個數據更新周期后以原子操作交換它們。 ChronicleMap 的優點之一是它能夠以高性能處理并發訪問,而不會阻塞。這使我們能夠保留堆外緩存的單個副本并在保持低延遲的同時處理高吞吐量請求。我們能夠重構并刪除圍繞維護兩個副本并在每次數據更新后交換它們的所有冗余代碼。
  • 降低代碼復雜性。在使用 ChronicleMap 之前,我們被迫采用多種方法來優化內存利用率,即使要付出額外查找的代價。其中一個例子就是頁面類別緩存的布局。由于每個分類的 URL 都分配了不同數量的類別,為了節省內存,我們根據 URL 的分布及其分配的類別數量創建了預先分配內存的存儲桶,例如,500 萬個 URL 的類別少于 10 個,屬于一個存儲桶。相比之下,少于 100 萬的 URL 最多有 50 個類別,屬于另一個存儲桶。每個存儲桶都是一個 HashMap,其中的鍵是 URL 哈希,值是連續數組的索引,該數組分為固定數量的類別。如果我們為每個 URL 使用單獨的數組,則每個存儲桶的大型連續數組旨在大幅減少所需的引用數量。如果沒有這個,數百萬次引用將大大延長任何完整的垃圾收集過程。還有另一個 HashMap 將 URL 映射到特定的存儲桶。此外,正如上文所述,我們必須維護兩個副本。我們可以使用更簡單的 ChronicleMap 消除所有這些代碼復雜性,因為我們不再需要擔心內存問題。

6.優點

6.1.更快的啟動速度

ChronicleMap 支持將內存緩存持久化到文件中。這樣,數據就可以在創建過程結束后繼續存在 — 例如,支持熱應用程序重新部署。我們利用此功能快速重啟應用程序,而無需對我們的緩存層進行 API 調用來加載初始數據。

6.2.共享緩存

在我們當前的設計中,每個 API 后端服務器都維護自己的 ChronicleMap 緩存。ChronicleMap 支持在不同的 JVM 進程之間共享相同的緩存。創建外部服務以將源數據移動到可在多個后端服務器之間共享的單個共置 ChronicleMap 緩存中將有助于我們降低網絡利用率。

6.3.自動調整大小

可以自動調整 ChronicleMap 緩存的大小。

7.不足

7.1.根據估算進行預分配

我們評估的版本沒有動態調整緩存大小的功能。我們需要預測數據集的增長并預先分配適當的內存量。對于上面提到的頁面類別緩存,我們還需要估計每頁的平均類別數并使用該數來分配內存。我們必須持續監控這一點以確保我們的假設成立。如果頁面類別的分布發生劇烈變化,則需要重新配置和重新部署應用程序。

7.2.基準

當 ChronicleMap 保存的數據可以裝入 RAM 中時,其性能最佳。但是,使用磁盤可以保存比 RAM 更大的數據。當數據無法裝入 RAM 中時,查找速度會變慢。對各種配置進行基準測試對我們來說并不容易,我們必須構建一個自定義測試應用程序來針對不同場景運行多個測試。

7.3.文檔

公開的產品文檔并未涵蓋所有細節。我們在源代碼中發現了多個有用的配置設置,而 Javadoc 文檔正是從這些設置中自動生成的。源代碼還被劃分為許多模塊和項目,這讓我們發現很難瀏覽。

7.4.處理自定義值

我們的要求之一是支持多映射,這是一種關聯容器,其中可以關聯多個值并返回給定鍵的值。我們必須編寫代碼來支持這一點。這還需要一個自定義序列化器代碼,這是我們自己實現的。后來,我們在代碼中發現了另一個可以擴展的類,于是我們改用這個類。不知道它的存在以及如何使用它,這延遲了我們的實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41324.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ChatGPT】全面解析 ChatGPT:從起源到未來

ChatGPT 是由 OpenAI 開發的一個基于 GPT(Generative Pre-training Transformer)架構的聊天機器人。通過自然語言處理(NLP)技術,ChatGPT 能夠理解和生成語言,與人類進行對話。本文將深入探討其起源、發展、…

SpringSecurity源碼分析-過濾器鏈是如何植入到spring中的

SpringSecurity源碼分析-過濾器鏈是如何植入到spring中的 一切的源頭都是因為在web.xml中配置了這樣一個Filter <!--security--><filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.…

NoSQL 之 Redis 集群部署

前言&#xff1a; &#xff08;1&#xff09;主從復制&#xff1a;主從復制是高可用Redis的基礎&#xff0c;哨兵和集群都是在主從復制基礎上實現高可用 的。主從復制主要實現了數據的多機備份&#xff0c;以及對于讀操作的負載均衡和簡單的故障恢復。缺陷&#xff1a; 故障…

vue3+antd 實現文件夾目錄右鍵菜單功能

原本的目錄結構&#xff1a; 右鍵菜單&#xff1a; 點擊菜單以后會觸發回調&#xff1a; 完整的前端代碼&#xff1a; <template><a-directory-treev-model:expandedKeys"expandedKeys"v-model:selectedKeys"selectedKeys"multipleshow-li…

在 Docker 容器中運行 Vite 開發環境,有這兩個問題要注意

容器化開發給我們帶來了很多便捷&#xff0c;但是在開發環境下也有一些問題要注意&#xff0c;如果不解決這些問題&#xff0c;你的開發體驗不會很好。 容器啟動正常&#xff0c;卻無法訪問 我們用 Docker 啟動一個 Vite Vue3 項目的開發環境后&#xff0c;發現端口日志一切…

計算機如何存儲浮點數

浮點數組成 在計算機中浮點數通常由三部分組成&#xff1a;符號位、指數位、尾數位。IEEE-754中32位浮點數如下&#xff1a; 上圖32bit浮點數包含1bit的符號位&#xff0c;8比特的指數位和23bit的尾數位。對于一個常規浮點數&#xff0c;我們來看看它是如何存儲和計算的。這里…

conda env pip install error:No space left on device

conda 環境 pip install error&#xff1a;No space left on device 文章目錄 conda 環境 pip install error&#xff1a;No space left on device現象1 實驗2 分析和解決辦法 現象 非root用戶的服務器&#xff0c;需要安裝環境&#xff0c;安裝的環境超過2GB sudo pip insta…

醫療機器人中的具身智能進展——自主超聲策略模型的任務編碼和局部探索

醫療機器人一直是具身智能的研究熱點。醫學圖像、醫療觸診、血壓血氧、心率脈搏和生物電信號等多模態生物醫學信息&#xff0c;不斷豐富著醫療機器人的感知范疇。 自主超聲 “自主超聲”屬于具身智能醫療機器人領域中話題度較高的研究方向。作為臨床檢查的重要手段之一&#…

線性系統理論及應用GUI設計及仿真

目錄 1.控制系統的狀態空間模型 1.1.狀態空間模型 1.2 傳遞函數模型 1.3 傳遞函數轉換為狀態空間模型 1.4.狀態空間模型轉換為傳遞函數 1.5.狀態空間模型轉化為約當標準型 2.線性系統的時域分析 2.1.矩陣指數函數的計算 2.2.線型定常連續系統的狀態空間模型求解 3.線…

ubuntu24.04按關鍵字卸載不需要的apt包

使用的時候發現一個imagemagic無法正常讀取文件&#xff0c;試圖卸載 man apt經過嘗試后&#xff0c;發現list的一個神奇關鍵字&#xff0c;用來顯示已安裝的軟件包 sudo apt list --installed | grep image按image關鍵字過濾&#xff1a; 之后按軟件名卸載即可 sudo apt pu…

開關電源——調制模式和工作模式

一、開關電源的調制模式 開關電源作為一種廣泛應用于電子設備中&#xff0c;用于將一定電壓和電流轉換為另一種電壓和電流的技術&#xff0c;以下是開關電源三種常見的調制模式&#xff1a; 脈沖寬度調制&#xff08;Pulse Width Modulation&#xff09; 脈沖頻率調制&#xff…

上升與下降

目錄 開頭程序程序的流程圖關于上升與下降的動畫(程序的效果)結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們要來看一個關于上升與下降的動畫和這個動畫相關的內容。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define HIGH 10 #include <stdio.h> #…

高德地圖 key 和安全密鑰使用

參考高德地圖&#xff1a;JS API 安全密鑰使用 高德地圖 key 和安全密鑰使用 一、通過明文方式設置參數查看如下成功后返回的信息 二、通過代理服務器轉發實驗&#xff1a;通過本地地址轉發返回錯的錯誤信息&#xff0c;如下通過正確的項目的的服務地址&#xff0c;返回正常參數…

【VUE基礎】VUE3第一節—vite創建vue3工程

什么是VUE Vue (發音為 /vju?/&#xff0c;類似 view) 是一款用于構建用戶界面的 JavaScript 框架。它基于標準 HTML、CSS 和 JavaScript 構建&#xff0c;并提供了一套聲明式的、組件化的編程模型&#xff0c;幫助你高效地開發用戶界面。無論是簡單還是復雜的界面&#xff0…

Java+MySQL8.0.36+ElementUI數字化產科信息管理系統之”五色管理”

JavaMySQL8.0.36ElementUI數字化產科信息管理系統之”五色管理” 一、數字化產科信息管理系統概述 數字化產科信息管理五色管理是一種基于孕產婦妊娠風險的分類管理方法&#xff0c;通過數字化手段實現孕產婦全周期的健康風險評估與管理。該方法將孕產婦按照風險等級分為綠色、…

DC-DC充放電原理

文章目錄 前言1. 電子器件1.1 電容1.2 電感 2. 升壓電路3. 降壓電路4. 電壓均衡電路4.1 被動均衡4.2 主動均衡 5. 我的疑問5.1 對于升壓電路&#xff0c;怎么設計升壓到多少V后&#xff0c;停止升壓&#xff1f;5.2 什么是等效電阻&#xff1f;5.3 快充是如何實現的&#xff1f…

紅外遙控:智能學習紅外遙控編碼

家用電器如電視、機頂盒、空調等都可以通過紅外遙控&#xff0c;Rainbow專為物聯網、家居智能而設計的硬件&#xff0c;自然在紅外遙控收發方面有很好的支持。 紅外遙控通常是由紅外發光二極管發射一定頻率的載波&#xff0c;通過載波攜帶的控制信息&#xff0c;經過調制的信號…

LightGlue: Local Feature Matching at Light Speed【文獻閱讀】

論文&#xff1a;LightGlue: Local Feature Matching at Light Speed 代碼&#xff1a;https://github.com/cvg/LightGlue 作者&#xff1a;1 ETH Zurich__2 Microsoft Mixed Reality & AI Lab Abstract 提出的LightGlue是一個深度神經網絡用于學習圖像間的局部特征匹配。…

back-end developer 后端開發的一些常識

通俗易懂版 1. 通信協議 1.1 RPC (Remote Procedure Call) 客觀解釋&#xff1a; RPC是一種協議&#xff0c;允許程序通過網絡在不同的計算機上調用函數&#xff0c;就像調用本地函數一樣。RPC隱藏了網絡通信的復雜性&#xff0c;使得遠程服務調用看起來像是本地調用。 現實…

WAIC | 上海人形機器人創新中心 | 最新演講 | 詳細整理

前言 筆者看了7月4號的人形機器人與具身智能發展論壇的直播&#xff0c;并在7月5日到了上海WAIC展會現場參觀。這次大會的舉辦很有意義&#xff0c;聽并看了各家的最新成果&#xff0c;拍了很多照片視頻&#xff0c;部分演講也錄屏了在重復觀看學習 稍后會相繼整理創立穹徹智…