pulsar中的延遲隊列使用詳解

Apache Pulsar的延遲隊列支持任意時間精度的延遲消息投遞,適用于金融交易、定時提醒等高時效性場景。其核心設計通過堆外內存索引隊列持久化分片存儲實現,兼顧靈活性與可擴展性。以下從實現原理、使用方式、優化策略及挑戰展開解析:


一、核心實現原理
  1. 延遲消息索引管理

    • 堆外內存優先級隊列:Pulsar通過DelayedMessageTracker維護延遲消息的索引(由timestamp | LedgerID | EntryID組成),按到期時間排序,形成最小堆結構。
    • 分片存儲優化(3.x+版本):引入BucketDelayedDeliveryTracker,將延遲索引按時間片(如5分鐘)分桶存儲。當前臨近時間的桶駐留內存,遠期桶持久化至BookKeeper磁盤,降低內存壓力。
  2. 投遞流程

    • 生產者發送:通過deliverAfter(相對時間)或deliverAt(絕對時間)指定延遲時間,客戶端計算時間戳后發送至目標Topic。
    • Broker處理:Dispatcher檢查消息到期狀態,到期消息直接投遞消費者;未到期消息存入延遲索引隊列,由定時任務觸發后續投遞。
  3. 容災與恢復

    • 索引重建:Broker故障或Topic遷移時,Pulsar從磁盤加載延遲索引并重建內存隊列,確保消息不丟失。但大規模延遲消息(如跨月級)的重建時間可能較長。

二、使用方式與代碼示例
  1. 生產者發送延遲消息

    // 相對時間延遲
    producer.newMessage().value("訂單已創建".getBytes()).deliverAfter(30, TimeUnit.MINUTES)  // 30分鐘后投遞.send();// 絕對時間延遲
    long deliverAt = System.currentTimeMillis() + 3600_000;  // 1小時后
    producer.newMessage().value("會議提醒".getBytes()).deliverAt(deliverAt).send();
    
  2. 消費者監聽

    @Override
    public void received(Consumer<String> consumer, Message<String> msg) {if (msg.getPublishTime() + msg.getDelayTime() <= System.currentTimeMillis()) {// 處理到期消息(如關閉超時訂單)consumer.acknowledge(msg);} else {consumer.negativeAcknowledge(msg);  // 重新入隊等待下次檢查}
    }
    

三、性能優化與挑戰
  1. 內存與存儲優化

    • 分片策略:按時間粒度(如5分鐘)劃分延遲索引桶,僅加載近期桶到內存,遠期桶持久化磁盤,減少內存占用。
    • 批量寫入:延遲索引積累至閾值(默認5萬條)后批量寫入磁盤,降低I/O開銷。
  2. 大規模延遲消息挑戰

    • 內存限制:舊版(3.x前)堆外內存索引隊列在訂閱組多或延遲跨度大時易耗盡內存。
    • 重建時間:跨月級延遲消息重建索引需數小時,可通過增加Topic分區提升并發度緩解。
  3. 最佳實踐

    • 控制延遲跨度:業務設計時盡量限制延遲時間(如≤7天),避免遠期消息導致存儲膨脹。
    • 獨立Topic隔離:將延遲消息與實時消息分離,減少對正常消費的影響。

四、應用場景
  1. 金融交易超時:支付訂單15分鐘內未確認則自動取消,釋放資源。
  2. 預約提醒:醫療掛號前1小時推送短信通知,降低爽約率。
  3. 異步重試:接口調用失敗后延遲5分鐘重試,避開高峰期。

五、未來演進

Pulsar社區計劃通過時間分區索引分層存儲進一步提升大規模延遲消息處理能力:

  • 動態加載時間片:僅將臨近時間片的索引加載到內存,其余持久化至冷存儲(如S3)。
  • 延遲消息專用存儲層:分離延遲消息與常規消息的存儲路徑,優化資源回收機制。

六、總結

Pulsar的延遲隊列通過時間分片索引混合存儲策略實現高精度、大規模的延遲消息投遞,尤其適合金融、電商等時效敏感場景。開發者需注意版本差異(3.x+推薦使用分片存儲),并通過合理設計延遲跨度和Topic分區規避性能瓶頸。未來隨著分層存儲的完善,Pulsar在處理超大規模延遲消息時將更具優勢。


在這里插入圖片描述

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

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

相關文章

單鏈表的實現 | 附學生信息管理系統的實現

目錄 1.前言&#xff1a; 2.單鏈表的相關概念&#xff1a; 2.1定義&#xff1a; 2.2形式&#xff1a; 2.3特點&#xff1a; 3.常見功能及代碼 &#xff1a; 3.1創建節點&#xff1a; 3.2頭插&#xff1a; 3.3尾插&#xff1a; 3.4頭刪&#xff1a; 3.5尾刪&#xff1a; 3.6插入…

java實用工具類Localstorage

public class LocalStorageUtil {//提供ThreadLocal對象,private static ThreadLocal threadLocalnew ThreadLocal();public static Object get(){return threadLocal.get();}public static void set(Object o){threadLocal.set(o);}public static void remove(){threadLocal.r…

LLM-大語言模型淺談

目錄 核心定義 典型代表 核心原理 用途 優勢與局限 未來發展方向 LLM&#xff08;Large Language Model&#xff09;大語言模型&#xff0c;指通過海量文本數據訓練 能夠理解和生成人類語言的深度學習模型。 核心定義 一種基于深度神經網絡&#xff08;如Transformer架…

【小兔鮮】day03 Home模塊與一級分類

【小兔鮮】day03 Home模塊與一級分類 1. Home-整體結構搭建和分類實現1.1 頁面結構 2. Home-banner輪播圖功能實現 1. Home-整體結構搭建和分類實現 1.1 頁面結構 分類實現 2. Home-banner輪播圖功能實現 輪播圖實現 在HomeBanner.vue中寫出輪播圖的結構 在apis目錄下新建h…

C++中的多態和模板

#include <iostream> #include <cstdlib> #include <ctime> #include <string>using namespace std;// 武器基類 class Weapon { public:virtual ~Weapon() {}virtual string getName() const 0; // 獲取武器名稱virtual int getAtk() const 0; …

Spring 概念

Spring 是一個功能強大、靈活且廣泛使用的 Java 企業級開發框架&#xff0c;它誕生于 2003 年&#xff0c;由 Rod Johnson 創建&#xff0c;初衷是簡化 Java EE 的開發過程。 一、Spring 是什么&#xff1f; 簡單來說&#xff1a; Spring 是一個輕量級的 Java 開發框架&#…

神經網絡之損失函數

引言&#xff1a;損失函數 &#xff08;Loss Function&#xff09;是機器學習和深度學習中非常重要的一個概念。用于衡量模型的預測值與真實值之間的差異&#xff0c;從而指導模型優化其參數以最小化這種差異。 一、損失函數作用 量化誤差&#xff1a;損失函數是將預測值和真實…

Java 基礎-32-枚舉-枚舉的應用場景

在Java編程中&#xff0c;枚舉&#xff08;Enum&#xff09;提供了一種強大的方式來定義一組固定的常量。它們不僅限于簡單的用途&#xff0c;還可以包含構造函數、方法和字段等高級功能&#xff0c;使其適用于多種不同的應用場景。本文將探討幾種常見的使用枚舉的場景&#xf…

【網絡安全】安全的網絡設計

網絡設計是網絡安全的基礎&#xff0c;一個好的網絡設計可以有效的防止攻擊者的入侵。在本篇文章中&#xff0c;我們將詳細介紹如何設計一個安全的網絡&#xff0c;包括網絡架構&#xff0c;網絡設備&#xff0c;網絡策略&#xff0c;以及如何處理網絡安全事件。 一、網絡架構…

網絡安全-等級保護(等保) 0. 前言

各位伙伴好&#xff1a; 招投標總結已過去一年了&#xff0c;時間飛逝&#xff0c;一直忙于工作&#xff0c;等保相關的內容斷斷續續整理了近半年的時間&#xff0c;但一直無暇完成博客內容。 等保已經是一個成熟的體系&#xff0c;現在已進入等保2.0時代&#xff0c;相關政策…

TLS協議詳解

TLS協議 一&#xff0c;TLS協議的組成 TLS協議架構模塊分為兩層&#xff1a;TLS記錄協議&#xff0c;TLS握手協議 ① TLS記錄協議&#xff1a; 是所有子協議的基層&#xff0c;規定了TLS收發數據的基本單位。所有子協議都需要通過記錄協議發出&#xff0c;多個記錄數據可以在…

ollama更新升級及警告解決

1. 概述 在大模型業務處理中&#xff0c;需要用到gemma3 和 qwen2.5-VL&#xff0c;當前服務器的ollama版本 0.3.11&#xff0c;無法滿足要求&#xff0c;需要更新升級。 2. 實施過程 參考官網升級要求&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 不知道…

ubuntu 配置固定ip

在裝服務器系統的時候&#xff0c;DHCP自動獲取ip時&#xff0c;路由可能會重新分配ip&#xff0c;為避免產生影響&#xff0c;可以關閉DHCP將主機設置為靜態ip。 系統環境 Ubuntu 22.04-Desktop 配置方式 一、如果是裝的Ubuntu圖形化&#xff08;就是可以用鼠標操作點擊應用…

套接字編程函數recv和send ,以及設置reuseaddress

recv就是去套接字讀緩沖區讀數據 阻塞模式下&#xff1a;讀緩沖區沒數據那就阻塞等待&#xff0c;若等待被打斷返回-1設置errno為EINTR 非阻塞模式下&#xff1a;讀緩沖區沒數據那就返回-1&#xff0c;設置errno為EAGAIN或EWOULDBLOCK。 若連接斷開返回0&#xff0c;讀取成功…

《C++后端開發最全面試題-從入門到Offer》目錄

當今科技行業對C++開發者的需求持續高漲,從金融科技到游戲開發,從嵌入式系統到高性能計算,C++憑借其卓越的性能和靈活性始終占據著關鍵地位。然而,成為一名優秀的C++工程師并非易事,不僅需要扎實的語言基礎,還要掌握現代C++特性、設計模式、性能優化技巧以及各種工業級開…

設計模式簡述(十)責任鏈模式

責任鏈模式 描述基本使用使用 描述 如果一個請求要經過多個類似或相關處理器的處理。 可以考慮將這些處理器添加到一個鏈上&#xff0c;讓請求逐個經過這些處理器進行處理。 通常&#xff0c;在一個業務場景下會對整個責任鏈進行初始化&#xff0c;確定這個鏈上有哪些Handler…

初識數據結構——Java集合框架解析:List與ArrayList的完美結合

&#x1f4da; Java集合框架解析&#xff1a;List與ArrayList的完美結合 &#x1f31f; 前言&#xff1a;為什么我們需要List和ArrayList&#xff1f; 在日常開發中&#xff0c;我們經常需要處理一組數據。想象一下&#xff0c;如果你要管理一個班級的學生名單&#xff0c;或…

ReFormX:現代化的 React 表單解決方案 - 深度解析與最佳實踐

ReFormX文檔 表單開發一直是前端工作中最繁瑣卻又最常見的任務之一。從簡單的登錄表單到復雜的多步驟配置頁面&#xff0c;開發者往往需要編寫大量重復代碼&#xff0c;處理繁瑣的狀態管理、數據驗證和聯動邏輯。ReFormX 應運而生&#xff0c;它不僅是一個表單組件庫&#xff…

WinForm真入門(9)——RichTextBox控件詳解

WinForm中RichTextBox控件詳解&#xff1a;從基礎到高級應用 上一文中筆者重點介紹了TextBox控件的詳細用法&#xff0c;忘記的 請點擊WinForm真入門(8)——TextBox控件詳解&#xff0c;那么本文中的RichTextBox與TextBox有什么區別嗎&#xff0c;光看名字的話&#xff0c;多了…

Draw.io 全面解析與競品分析:圖表繪制工具的深度對比

目錄 一、Draw.io 全面介紹 1. 產品概述 2. 核心功能特點 3. 用戶體驗 4. 商業模式 二、市場競品分析 1. 主要競品概覽 2. 深度功能對比 3. 價格策略對比 4. 技術架構對比 三、用戶場景與選擇建議 1. 不同場景下的工具推薦 2. 未來發展趨勢 四、結論 diagrams.net…