消息隊列的使用

使用內存隊列來處理基于內存的【生產者-消費者】場景

思考和使用Disruptor

  • Disruptor可以實現單個或多個生產者生產消息,單個或多個消費者消息,且消費者之間可以存在消費消息的依賴關系

  • 使用Disruptor需要結合業務特性,設計要靈活

  • 什么業務場景適合使用Disruptor

    • Disruptor核心優勢在于極致的低延遲和極高吞吐量,且通信發生在單個JVM進程內部的場景

    • 高頻交易系統 (HFT - High-Frequency Trading):

      • 場景描述: 金融市場中的算法交易,需要在微秒甚至納秒級別對市場數據做出反應,并快速下單。延遲每降低一點,都可能帶來巨大的競爭優勢。

      • 為何適合: Disruptor 最初就是為 LMAX 交易所設計的,用于處理海量的訂單和行情數據。其低延遲特性對于捕捉轉瞬即逝的交易機會至關重要。它可以用于訂單處理流水線、市場數據分發、風險控制計算等。

    • 實時風控與反欺詐系統:

      • 場景描述: 在支付、交易、登錄等關鍵操作發生時,需要實時分析用戶行為、交易模式等,快速識別潛在的風險或欺詐行為,并在毫秒級內做出決策(如阻止交易、要求額外驗證)。

      • 為何適合: 需要處理高并發的事件流,并進行復雜的規則匹配和計算,同時對響應時間有極高要求。Disruptor 可以作為事件處理引擎的核心,確保快速處理和決策。

    • 高性能日志處理框架:

      • 場景描述: 應用程序產生大量日志,需要異步地、高效地將日志事件從業務線程傳遞給日志寫入線程,同時盡量減少對業務線程性能的影響。

      • 為何適合: Log4j2 的 Async Loggers 就是基于 Disruptor 實現的。它可以顯著降低日志記錄操作對應用主線程的阻塞時間,提高應用的整體吞吐量。

    • 游戲服務器事件處理:

      • 場景描述: 大型多人在線游戲(MMO)服務器需要處理來自成千上萬玩家的并發操作(移動、攻擊、聊天等),并實時更新游戲世界狀態,廣播給其他相關玩家。

      • 為何適合: 游戲服務器對延遲非常敏感,任何卡頓都會嚴重影響玩家體驗。Disruptor 可以用來構建高效的事件處理循環,快速響應玩家輸入并分發狀態更新。

    • 實時數據分析與復雜事件處理 (CEP - Complex Event Processing):

      • 場景描述: 從各種數據源(如傳感器、網絡流量、用戶行為日志)接收高速數據流,實時識別特定模式、趨勢或異常,并觸發相應動作。

      • 為何適合: 需要在大量數據涌入時,以極低的延遲進行匹配和分析。Disruptor 可以作為CEP引擎內部事件排隊和分發的骨干。

    • 網絡數據包處理/高性能網絡應用:

      • 場景描述: 構建需要處理大量并發連接和高速網絡數據包的服務器應用,如自定義的應用層網關、高性能代理服務器等。

      • 為何適合: 當網絡 I/O 線程接收到數據包后,需要快速地將這些數據包(或解析后的事件)分發給工作線程進行處理。Disruptor 可以作為 I/O 線程和業務邏輯處理線程之間的高效橋梁。

    • 任務調度與并行計算的內部協調:

      • 場景描述: 在一個復雜的計算任務中,可以將任務分解為多個階段,由不同的線程組處理。階段之間的數據傳遞需要高效且低延遲。

      • 為何適合: 如果這些階段都在同一個JVM內部,并且對性能要求極高,Disruptor 可以作為這些并行處理單元之間的數據交換通道,避免傳統隊列的鎖競爭開銷。

Kafka

消息隊列的設計意圖

當消費不均衡(生產者生產的過快消費者消費的過快)時,就在生產者和消費者中間加一個緩沖層,這個緩沖層就是消息隊列

消息隊列是分布式系統中的重要組件

消息隊列的作用

  • 異步:提升吞吐量

  • 解耦:減少依賴,生產者和消費者之間沒有直接的依賴,一個系統的故障不會影響另一個系統,保證系統的穩定性和健壯性

  • 削峰填谷:消除短時負載過高

    • 削峰:生產者的速度非常的高,并發流量非常的大,此時可以增加消費者線程,提高并發處理能力,來達到生產和消費的平衡

    • 填谷:生產的頻率降低,流量變小,此時可以減少一些消費者線程,來達到生產和消費的平衡

  • 順序性保證

  • 可靠性保證:數據持久化

從整體的角度來看Kafka

Kafka分區再均衡(Rebalance, 平衡)

Kafka數據存儲

  • 日志文件消息格式

消息丟失和重復消費

Kafka消息丟失

從Kafka生產,消息持久化,消費過程看消息丟失

生產,消息持久化,消費過程丟失的解決方案

Kafka重復消費

  • 重復消費的根本原因在于:已經消費了數據,但是offset沒有成功提交,很大一部分原因是再均衡

    • 消費者宕機,重啟,消費了消息但是沒有提交offset

    • 還沒有提交offset時,發生了rebalance

    • 消息處理耗時太大,超過了(max.poll.interval.ms),發生了rebalance

  • 重復消費的解決方案

    • 最根本的解決方案是消費消息保證冪等性

      • 記錄消息表,使用唯一索引

      • 緩存消費過的消息id(位圖)

使用好Kafka

集成使用Kafka

常見的兩種方法使用Kafka
  • 使用@KafkaListener把消費過程(poll和提交offset)交給框架

  • 自己管理消息的拉取(poll)和消息偏移量(offset)的提交

生產者發送消息有三種方式

  • 發送之后什么都不管

  • 同步發送

  • 異步發送

消費者消費消息

  • 消費者主動拉取消息消費

  • 通過注解實現消息的監聽消費(@KafkaListener)

延遲隊列和優先級隊列

RabbitMQ架構模型

通過RabbitMQ實現延遲隊列和優先級隊列

死信隊列

死信:如果隊列中消息出現以下兩種情況,則消息變為死信狀態

  • 如果消息在隊列中的時間超過了我設置的ttl(過期時間)

  • 消息隊列的消息數量超過了最大的隊列長度

優先級隊列:最大值是255,最小值是0,值越大,優先級越高

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

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

相關文章

《帝國時代1》游戲秘籍

資源類 PEPPERONI PIZZA:獲得 1000 食物。COINAGE:獲得 1000 金。WOODSTOCK:獲得 1000 木頭。QUARRY:獲得 1000 石頭。 建筑與生產類 STEROIDS:快速建筑。 地圖類 REVEAL MAP:顯示所有地圖。NO FOG&#xf…

使用JSP踩過的坑

雖然說jsp已經過時了,但是有時維護比較老的項目還是需要的。 下面說下,我使用jsp踩過的坑: 1.關于打印輸出 在jsp中輸出使用 out.println("hello");而不是 System.out.println("hello");如果在定義函數部分需要打印…

redis集群創建時手動指定主從關系的方法

適用場景: 創建主從關系時默認參數 --cluster-replicas 1 會自動分配從節點。 為了能精確控制 Redis Cluster 的主從拓撲結構,我們通過 Redis Cluster 的手動分片功能來實現 一、手動指定主從關系的方法 使用 redis-cli --cluster-replicas 0 先創建純…

ROS合集(七)SVIn2聲吶模塊分析

文章目錄 一、整體思想二、具體誤差建模流程三、總結明確(預測值與觀測值)四、選點邏輯五、Sonar 數據處理流水線1. ROS Launch 配置(imagenex831l.launch)2. SonarNode 節點(sonar_node.py)3. Subscriber …

Python爬蟲實戰:研究PySpider框架相關技術

1. 引言 1.1 研究背景與意義 網絡爬蟲作為互聯網數據采集的重要工具,在信息檢索、輿情分析、市場調研等領域發揮著重要作用。隨著互聯網信息的爆炸式增長,如何高效、穩定地獲取所需數據成為了一個關鍵挑戰。PySpider 作為一款功能強大的 Python 爬蟲框架,提供了豐富的功能…

《大模型開源與閉源的深度博弈:科技新生態下的權衡與抉擇》

開源智能體大模型的核心魅力,在于它構建起了一個全球開發者共同參與的超級協作網絡。想象一下,來自世界各個角落的開發者、研究者,無論身處繁華都市還是偏遠小鎮,只要心懷對技術的熱愛與追求,就能加入到這場技術狂歡中…

大數據模型對陌生場景圖像的識別能力研究 —— 以 DEEPSEEK 私有化部署模型為例

摘要 本研究聚焦于已訓練的大數據模型能否識別未包含在樣本數據集中的陌生場景圖像這一問題,以 DEEPSEEK 私有化部署模型為研究對象,結合機器學習理論,分析模型識別陌生場景圖像的影響因素,并通過理論探討與實際應用場景分析&…

STM32——從點燈到傳感器控制

STM32基礎外設開發:從點燈到傳感器控制 一、前言 本篇文章總結STM32F10x系列基礎外設開發實例,涵蓋GPIO控制、按鍵檢測、傳感器應用等。所有代碼基于標準庫開發,適合STM32初學者參考。 二、硬件準備 STM32F10x系列開發板LED模塊有源蜂鳴器…

[特殊字符] 使用增量同步+MQ機制將用戶數據同步到Elasticsearch

在開發用戶搜索功能時,我們通常會將用戶信息存儲到 Elasticsearch(簡稱 ES) 中,以提高搜索效率。本篇文章將詳細介紹我們是如何實現 MySQL 到 Elasticsearch 的增量同步,以及如何通過 MQ 消息隊列實現用戶信息實時更新…

MyBatis緩存機制全解析

在MyBatis中,緩存分為一級緩存和二級緩存,它們的主要目的是減少數據庫的訪問次數,提高查詢效率。下面簡述這兩種緩存的工作原理: 一、 一級緩存(SqlSession級別的緩存) 一級緩存是MyBatis默認開啟的緩存機…

【短距離通信】【WiFi】WiFi7關鍵技術之4096-QAM、MRU

目錄 3. 4096-QAM 3.1 4096-QAM 3.2 QAM 的階數越高越好嗎? 4. MRU 4.1 OFDMA 和 RU 4.2 MRU 資源分配 3. 4096-QAM 摘要 本章主要介紹了Wi-Fi 7引入的4096-QAM對數據傳輸速率的提升。 3.1 4096-QAM 對速率的提升 Wi-Fi 標準一直致力于提升數據傳輸速率&a…

【二刷力扣】【力扣熱題100】今天的題目是:283.移動零

題目: 給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。 請注意 ,必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸…

機器學習中的多GPU訓練模式

文章目錄 一、數據并行(Data Parallelism)二、模型并行(Model Parallelism)1. 模型并行2. 張量并行(Tensor Parallelism) 三、流水線并行(Pipeline Parallelism)四、混合并行&#x…

《JavaScript 性能優化:從原理到實戰的全面指南》

《JavaScript 性能優化:從原理到實戰的全面指南》 一、JavaScript 性能優化基礎理論 在深入探討 JavaScript 性能優化技術之前,我們需要明白JavaScript 的執行機制和性能瓶頸產生的根本原因。JavaScript 是一種單線程、非阻塞的腳本語言,其…

選擇合適的Azure數據庫監控工具

Azure云為組織提供了眾多服務,使其能夠無縫運行應用程序、Web服務和服務器部署,其中包括云端數據庫部署。Azure數據庫能夠與云應用程序實現無縫集成,具備可靠、易擴展和易管理的特性,不僅能提升數據庫可用性與性能,同時…

9.4在 VS Code 中配置 Maven

在 VS Code 中配置 Maven 需要完成 Maven 環境安裝 一、安裝 Maven(如果未安裝) 下載 Maven 訪問 Apache Maven 官網,下載最新版本的 Maven(如apache-maven-3.9.9-bin.zip)。 解壓文件 將下載的 ZIP 文件解壓到本地目…

影刀自動化流程復用技巧:流程復用

草莓時刻會創建一個新的空白流程。但是很多時候需要復用過往基礎流程,在此基礎上進行修改即可。而而不是重新創建基礎流程。 為了解決這個問題,我們需要了解一下影刀流程的基礎結構。 影刀流程基礎結構概覽 影刀自動化流程的基礎結構主要包括幾個關鍵組…

理論篇六:如何在Webpack中實現持久化緩存?

在 Webpack 中實現持久化緩存可以顯著提升構建速度,尤其是在大型項目中。以下是 7 種核心策略 及其詳細配置方法: 一、文件哈希命名(Content Hash) 確保文件內容變化時哈希值才改變,利用瀏覽器緩存。 // webpack.config.js output: {filename: [name].[contenthash:8].j…

C++單例模式與線程安全

C單例模式的線程安全實踐與優化-CSDN博客 https://www.zhihu.com/question/56527586/answer/2344903391 C11中的單例模式 在C11及更高版本中,可以使用std::call_once和std::once_flag來確保單例實例的線程安全初始化。這種方法不需要顯式地使用互斥鎖&#xff0c…

UE5 圖片導入,拖到UI上變色

UE5會自動把藍色的圖片當成法線貼圖處理,非常傻逼 雙擊出問題的圖片,右側面板將壓縮設置從法線改回默認