高級特性實戰:死信隊列、延遲隊列與優先級隊列(三)

四、優先級隊列:優先處理重要任務

4.1 優先級隊列概念解析

優先級隊列(Priority Queue)是一種特殊的隊列數據結構,它與普通隊列的主要區別在于,普通隊列遵循先進先出(FIFO)的原則,即先進入隊列的元素先被取出;而優先級隊列則根據元素的優先級來決定取出順序,優先級高的元素會優先被取出并處理,而不是按照進入隊列的先后順序 。

在優先級隊列中,每個元素都被賦予了一個優先級值,這個值可以是一個數字、一個權重,或者根據具體業務定義的某種優先級標識。當從隊列中獲取元素時,系統會首先返回具有最高優先級的元素。如果多個元素具有相同的優先級,那么這些元素之間通常按照它們進入隊列的順序進行處理,即遵循 FIFO 原則 。

4.2 優先級隊列應用場景

優先級隊列在實際應用中有著廣泛的場景,以下是一些常見的例子:

  • 電商訂單處理:在電商系統中,不同類型的訂單可能具有不同的優先級。例如,VIP 客戶的訂單、加急訂單或者金額較大的訂單,可以被賦予較高的優先級。這些高優先級訂單會優先進入處理流程,優先進行庫存分配、發貨等操作,以提升重要客戶的購物體驗,同時確保高價值訂單能夠得到及時處理,提高業務收益。
  • 任務調度系統:在操作系統或分布式系統的任務調度模塊中,任務可以根據其重要性、緊急程度或者資源需求等因素被分配不同的優先級。比如,系統關鍵任務(如系統監控、數據備份等)具有較高優先級,而一些后臺輔助任務(如日志分析、數據統計等)優先級較低。優先級隊列可以確保關鍵任務優先被調度執行,保證系統的穩定運行和關鍵業務的正常進行 。
  • 消息推送系統:在消息推送場景中,不同類型的消息也有不同的優先級。例如,短信驗證碼、重要通知等消息,對于及時性要求較高,需要優先推送。而一些普通的營銷消息、活動通知等,優先級相對較低。通過優先級隊列,消息推送系統可以優先處理和發送高優先級消息,確保用戶能夠及時收到關鍵信息 。

4.3 優先級隊列實戰案例(以 RabbitMQ 為例)

在 RabbitMQ 中實現優先級隊列,需要進行以下幾個步驟:

  1. 聲明優先級隊列:在創建隊列時,通過設置隊列的x-max-priority參數來指定隊列的最大優先級。該參數的值表示隊列支持的最大優先級級別,例如設置為 10,表示隊列中的消息優先級可以從 0 到 10,其中 10 為最高優先級。
  1. 發送帶有優先級的消息:生產者在發送消息時,通過設置消息的priority屬性來指定消息的優先級。消息的優先級值必須在隊列聲明的最大優先級范圍內,否則會被自動調整為隊列的最大優先級 。
  1. 消費者消費消息:消費者從優先級隊列中獲取消息時,RabbitMQ 會按照消息的優先級順序將消息發送給消費者,高優先級的消息會優先被消費。

下面是一個使用 Java 和 RabbitMQ 實現優先級隊列的示例代碼:

首先,引入 RabbitMQ 的 Java 客戶端依賴:

 

<dependency>

<groupId>com.rabbitmq</groupId>

<artifactId>amqp-client</artifactId>

<version>5.14.2</version>

</dependency>

然后,編寫生產者代碼,向優先級隊列發送不同優先級的消息:

 

import com.rabbitmq.client.AMQP;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

public class Producer {

private static final String EXCHANGE_NAME = "priority_exchange";

private static final String QUEUE_NAME = "priority_queue";

public static void main(String[] args) throws Exception {

ConnectionFactory factory = new ConnectionFactory();

factory.setHost("localhost");

try (Connection connection = factory.newConnection();

Channel channel = connection.createChannel()) {

channel.exchangeDeclare(EXCHANGE_NAME, "direct");

// 聲明優先級隊列,設置最大優先級為10

java.util.Map<String, Object> argsMap = new java.util.HashMap<>();

argsMap.put("x-max-priority", 10);

channel.queueDeclare(QUEUE_NAME, false, false, false, argsMap);

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, QUEUE_NAME);

// 發送不同優先級的消息

for (int i = 1; i <= 10; i++) {

String message = "Message " + i;

int priority = i % 5; // 模擬不同優先級,范圍0 - 4

AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()

.priority(priority)

.build();

channel.basicPublish(EXCHANGE_NAME, QUEUE_NAME, properties, message.getBytes("UTF-8"));

System.out.println("Sent: " + message + " with priority " + priority);

}

}

}

}

接著,編寫消費者代碼,從優先級隊列中接收并處理消息:

 

import com.rabbitmq.client.*;

import java.io.IOException;

public class Consumer {

private static final String EXCHANGE_NAME = "priority_exchange";

private static final String QUEUE_NAME = "priority_queue";

public static void main(String[] args) throws Exception {

ConnectionFactory factory = new ConnectionFactory();

factory.setHost("localhost");

try (Connection connection = factory.newConnection();

Channel channel = connection.createChannel()) {

channel.exchangeDeclare(EXCHANGE_NAME, "direct");

// 聲明優先級隊列,設置最大優先級為10

java.util.Map<String, Object> argsMap = new java.util.HashMap<>();

argsMap.put("x-max-priority", 10);

channel.queueDeclare(QUEUE_NAME, false, false, false, argsMap);

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, QUEUE_NAME);

System.out.println("Waiting for messages...");

DeliverCallback deliverCallback = (consumerTag, delivery) -> {

String message = new String(delivery.getBody(), "UTF-8");

int priority = delivery.getProperties().getPriority();

System.out.println("Received: " + message + " with priority " + priority);

channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

};

channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});

}

}

}

在上述代碼中,生產者創建了一個優先級隊列,并向其中發送了 10 條帶有不同優先級的消息。消費者從該隊列中接收消息,并按照消息的優先級順序進行處理。通過這個案例,我們可以清晰地看到優先級隊列在 RabbitMQ 中的實現和應用 。

五、總結與展望

死信隊列、延遲隊列和優先級隊列作為消息隊列的高級特性,在分布式系統中各自發揮著獨特且關鍵的作用。死信隊列就像是系統的 “守護衛士”,當消息遭遇異常無法正常消費時,它能夠及時將這些消息收納到死信隊列中,避免消息的丟失,為系統的穩定運行提供了堅實的保障。延遲隊列則如同一個精準的 “時間管家”,通過巧妙地設置消息的延遲時間,實現了任務的定時執行,讓系統的業務流程能夠按照既定的時間規則有序推進。優先級隊列則好比是資源分配的 “決策者”,根據消息的優先級來決定消費順序,確保重要的任務能夠優先得到處理,提升了系統的整體性能和業務處理效率。

在實際應用中,我們需要根據具體的業務場景和需求,謹慎且合理地選擇和配置這些隊列。在使用死信隊列時,要精心設置死信的條件和處理邏輯,確保能夠及時、有效地處理異常消息,同時也要注意避免死信隊列中的消息堆積過多,影響系統性能。對于延遲隊列,要精確地計算和設置延遲時間,以滿足業務對時間的精準要求。在實現方式上,不同的技術方案各有優劣,我們需要綜合考慮系統的性能、可靠性、復雜度等因素,選擇最適合的實現方式。在運用優先級隊列時,要科學地定義消息的優先級規則,確保優先級的劃分能夠準確反映業務的重要程度和緊急程度。

隨著分布式系統和云計算技術的持續迅猛發展,消息隊列的應用場景也在不斷地拓展和深化。未來,消息隊列有望在性能、可靠性、可擴展性等方面取得更為顯著的突破和提升。例如,在性能方面,可能會出現更高效的消息存儲和傳輸算法,以滿足大規模數據的快速處理需求;在可靠性方面,會進一步完善消息的持久化和容錯機制,確保消息在任何情況下都不會丟失;在可擴展性方面,將更好地支持分布式集群部署,實現動態的資源分配和負載均衡。同時,消息隊列與人工智能、大數據等新興技術的融合也將成為未來的發展趨勢,為解決各種復雜的業務問題提供更為強大的支持和解決方案。

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

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

相關文章

python打卡day34

GPU訓練及類的call方法 知識點回歸&#xff1a; CPU性能的查看&#xff1a;看架構代際、核心數、線程數GPU性能的查看&#xff1a;看顯存、看級別、看架構代際GPU訓練的方法&#xff1a;數據和模型移動到GPU device上類的call方法&#xff1a;為什么定義前向傳播時可以直接寫作…

Newtonsoft Json序列化數據不序列化默認數據

問題描述 數據在序列號為json時,一些默認值也序列化了,像旋轉rot都是0、縮放scal都是1,這樣的默認值完全可以去掉,減少和服務器通信數據量 核心代碼 數據結構字段增加[DefaultValue(1.0)]屬性,縮放的默認值為1 public class Vec3DataOne{[DefaultValue(1.0)] public flo…

可增添功能的鼠標右鍵優化工具

軟件介紹 本文介紹一款能優化Windows電腦的軟件&#xff0c;它可以讓鼠標右鍵菜單添加多種功能。 軟件基本信息 這款名為Easy Context Menu的鼠標右鍵菜單工具非常小巧&#xff0c;軟件大小僅1.14MB&#xff0c;打開即可直接使用&#xff0c;無需進行安裝。 添加功能列舉 它…

Gemini 2.5 Pro 一次測試

您好&#xff0c;您遇到的重定向循環問題&#xff0c;即在 /user/messaging、/user/login?return_to/user/messaging 和 /user/login 之間反復跳轉&#xff0c;通常是由于客戶端的身份驗證狀態檢查和頁面重定向邏輯存在沖突或競爭條件。 在分析了您提供的代碼&#xff08;特別…

vue3前端后端地址可配置方案

在開發vue3項目過程中&#xff0c;需要切換不同的服務器部署&#xff0c;代碼中配置的服務需要可靈活配置&#xff0c;不隨著run npm build把網址打包到代碼資源中&#xff0c;不然每次切換都需要重新run npm build。需要一個配置文件可以修改服務地址&#xff0c;而打包的代碼…

大模型微調與高效訓練

隨著預訓練大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能進入了一個新的范式:預訓練-微調(Pre-train, Fine-tune)。這些大模型在海量數據上學習到了通用的、強大的表示能力和世界知識。然而,要將這些通用模型應用于特定的下游任務或領域,通常還需要進行微調…

編程技能:字符串函數10,strchr

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;字符串函數09&#xff0c;strncmp 回到目錄…

動態規劃-53.最大子數組和-力扣(LeetCode)

一、題目解析 在給定順序的數組中找出一段具有最大和的連續子數組&#xff0c;且大小最小為1. 二、算法原理 1.狀態表示 我們可以意一一枚舉出所有的子數組&#xff0c;但我們想要的是最大子數組&#xff0c;所以f[i]表示&#xff1a;以i位置為結尾&#xff0c;所有子數組的最…

C++ queue對象創建、queue賦值操作、queue入隊、出隊、獲得隊首、獲得隊尾操作、queue大小操作、代碼練習

對象創建&#xff0c;代碼見下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默認構造函數queue<int> q1;// 2 拷貝構造函數queue<int> q2(q1);return 0;} queue賦值操作&#xff0c;代碼見下 #include<iostream>…

全鏈路解析:影刀RPA+Coze API自動化工作流實戰指南

在數字化轉型加速的今天&#xff0c;如何通過RPA與API的深度融合實現業務自動化提效&#xff0c;已成為企業降本增效的核心命題。本文以「影刀RPA」與「Coze API」的深度協作為例&#xff0c;系統性拆解從授權配置、數據交互到批量執行的完整技術鏈路&#xff0c;助你快速掌握跨…

php本地 curl 請求證書問題解決

錯誤: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解決方案 在php目錄下創建證書文件夾, 執行下面生成命令, 然后在php.ini 文件中配置證書路徑; 重啟環境 curl --eta…

【圖數據庫】--Neo4j 安裝

目錄 1.Neo4j --概述 2.JDK安裝 3.Neo4j--下載 3.1.下載資源包 3.2.創建環境變量 3.3.運行 Neo4j 是目前最流行的圖形數據庫(Graph Database)&#xff0c;它以節點(Node)、關系(Relationship)和屬性(Property)的形式存儲數據&#xff0c;專門為處理高度連接的數據而設計。…

MIT 6.S081 2020Lab5 lazy page allocation 個人全流程

文章目錄 零、寫在前面一、Eliminate allocation from sbrk()1.1 說明1.2 實現 二、Lazy allocation2.1 說明2.2 實現 三、Lazytests and Usertests3.1 說明3.2 實現3.2.1 lazytests3.2.2 usertests 零、寫在前面 可以閱讀下4.6頁面錯誤異常 像應用程序申請內存&#xff0c;內…

(Git) 稀疏檢出(Sparse Checkout) 拉取指定文件

文章目錄 &#x1f3ed;作用&#x1f3ed;指令總覽&#x1f477;core.sparseCheckout&#x1f477;sparse-checkout 文件 &#x1f3ed;實例演示?END&#x1f31f;交流方式 &#x1f3ed;作用 類似于 .gitignore 進行文件的規則匹配。 一般在需要拉取大型項目指定的某些文件…

docker初學

加載鏡像&#xff1a;docker load -i ubuntu.tar 導出鏡像&#xff1a;docker save -o ubuntu1.tar ubuntu 運行&#xff1a; docker run -it --name mu ubuntu /bin/bash ocker run -dit --name mmus docker.1ms.run/library/ubuntu /bin/bash 進入容器&#xff1a;docke…

Docker系列(二):開機自啟動與基礎配置、鏡像加速器優化與疑難排查指南

引言 docker 的快速部署與高效運行依賴于兩大核心環節&#xff1a;基礎環境搭建與鏡像生態優化。本期博文從零開始&#xff0c;系統講解 docker 服務的管理配置與鏡像加速實踐。第一部分聚焦 docker 服務的安裝、權限控制與自啟動設置&#xff0c;確保環境穩定可用&#xff1b…

計算機視覺(圖像算法工程師)學習路線

計算機視覺學習路線 Python基礎 常量與變量 列表、元組、字典、集合 運算符 循環 條件控制語句 函數 面向對象與類 包與模塊Numpy Pandas Matplotlib numpy機器學習 回歸問題 線性回歸 Lasso回歸 Ridge回歸 多項式回歸 決策樹回歸 AdaBoost GBDT 隨機森林回歸 分類問題 邏輯…

工業軟件國產化:構建自主創新生態,賦能制造強國建設

隨著全球產業環境的變化和技術的發展&#xff0c;建立自主可控的工業體系成為我國工業轉型升級、走新型工業化道路、推動國家制造業競爭水平提升的重要抓手。 市場倒逼與政策護航&#xff0c;國產化進程雙輪驅動 據中商產業研究院預測&#xff0c;2025年中國工業軟件市場規模…

OpenCV CUDA 模塊圖像過濾------創建一個高斯濾波器函數createGaussianFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::createGaussianFilter 是 OpenCV CUDA 模塊中的一個工廠函數&#xff0c;用于創建一個高斯濾波器。這個濾波器可以用來平滑圖像&#…

【RocketMQ 生產者和消費者】- 生產者發送故障延時策略

文章目錄 1. 前言2. FaultItem3. LatencyFaultToleranceImpl 容錯集合處理類3.1 updateFaultItem 更新容錯集合3.2 isAvailable 判斷 broker 是否可用3.3 pickOneAtLeast 至少選出一個故障 broker 4. MQFaultStrategy 故障策略類4.1 屬性4.2 updateFaultItem 更新延遲故障容錯信…