RabbitMQ实战指南(三)—— 高级特性

RabbitMQ实战指南(三)—— 高级特性

RabbitMQ是一个功能强大的消息队列系统,提供了许多高级特性来满足各种消息传递的需求。下面是一些常用的高级特性的详细描述和代码示例:

详细描述

1.TTL(Time-To-Live)是指消息的生存时间,它可以设定在消息发送时或队列创建时。一旦消息的生存时间超过了设定的 TTL,就会被标记为过期消息并被丢弃或转发到死信队列。

2.死信(Dead Letter)队列是用于存放被标记为过期消息或被拒绝的消息的特殊队列。当消息被标记为过期或者被拒绝时,可以将其转发到死信队列以备后续处理,例如记录日志或进一步分析。

3.延迟队列(Delay Queue)是一种特殊的队列,它可以延迟消息的传递。当消息被发送到延迟队列时,不会立即传递给消费者,而是在设定的延迟时间后才会被传递。这种机制可以用于处理需要延迟处理的任务,如定时任务或订单超时处理。

4.优先级队列(Priority Queue)是一种按照消息优先级排序的队列。通过设置消息的优先级,可以确保高优先级的消息在队列中被优先处理,避免低优先级的消息长时间阻塞在队列中。

5.RPC(Remote Procedure Call)是一种远程过程调用的机制,它允许一个应用程序向另一个应用程序请求执行某个特定的操作。在使用RabbitMQ进行RPC时,客户端发送请求消息到队列,并等待服务器返回响应消息,从而实现应用程序之间的通信。

6.消息持久化是指将消息存储到磁盘,以防止消息在RabbitMQ重启或崩溃时丢失。在RabbitMQ中,默认情况下,消息是非持久化的,但通过将消息的delivery mode设置为2可以实现消息的持久化。当生产者发送持久化消息时,RabbitMQ会将其存储到磁盘上的日志文件中,以确保消息的安全。

7.在生产端,消息确认(Publish Confirm)是一种机制,用于确保消息成功发送到RabbitMQ服务器。通过设置消息的confirm模式,生产者可以在消息成功到达服务器后得到确认。

代码示例:

TTL(Time-To-Live):消息的生存时间,可以在消息发送时设置。当消息的生存时间超过设定的时间后,消息将被删除。这对于一些需要限定消息处理时间的场景非常有用。

import pika# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 设置队列的TTL10秒
args = {'x-message-ttl': 10000
}
channel.queue_declare(queue='my_queue', arguments=args)# 发送消息时设置消息的TTL5秒
channel.basic_publish(exchange='', routing_key='my_queue', body='Hello, RabbitMQ!', properties=pika.BasicProperties(expiration='5000'))# 关闭连接
connection.close()

死信(Dead Letter Exchange):当消息被拒绝、过期或达到最大重试次数时,可以将其发送到一个指定的交换机,这个交换机被称为死信交换机。通过使用死信交换机,可以对无法处理的消息进行统一处理。

import pika# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 声明死信交换机和队列
channel.exchange_declare(exchange='dlx_exchange', exchange_type='direct')
channel.queue_declare(queue='dlx_queue')
channel.queue_bind(exchange='dlx_exchange', queue='dlx_queue', routing_key='dlx_key')# 设置队列的死信交换机
args = {'x-dead-letter-exchange': 'dlx_exchange','x-dead-letter-routing-key': 'dlx_key'
}
channel.queue_declare(queue='my_queue', arguments=args)# 发送消息时设置消息的TTL5秒
channel.basic_publish(exchange='', routing_key='my_queue', body='Hello, RabbitMQ!', properties=pika.BasicProperties(expiration='5000'))# 关闭连接
connection.close()

延迟队列:通过TTL和死信结合,可以实现延迟队列的功能。可以将需要延迟发送的消息发送到一个队列中,并设置相应的TTL,当消息过期时会被发送到死信队列中。

import pika# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 声明死信交换机和队列
channel.exchange_declare(exchange='dlx_exchange', exchange_type='direct')
channel.queue_declare(queue='dlx_queue')
channel.queue_bind(exchange='dlx_exchange', queue='dlx_queue', routing_key='dlx_key')# 设置队列的TTL和死信交换机
args = {'x-dead-letter-exchange': 'dlx_exchange','x-dead-letter-routing-key': 'dlx_key','x-message-ttl': 10000
}
channel.queue_declare(queue='delay_queue', arguments=args)# 发送消息到延迟队列
channel.basic_publish(exchange='', routing_key='delay_queue', body='Hello, RabbitMQ!')# 关闭连接
connection.close()

优先级队列:可以为消息设置优先级,高优先级的消息会被先消费。默认情况下,RabbitMQ不支持优先级队列,需要安装插件rabbitmq-priority-queue。

import pika# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 声明插件
channel.exchange_declare(exchange_type='x-delayed-message', exchange='delayed_exchange', arguments={'x-delayed-type': 'direct'
})# 声明队列
channel.queue_declare(queue='priority_queue', arguments={'x-max-priority': 10  # 设置队列的优先级
})# 绑定队列和交换机
channel.queue_bind(queue='priority_queue', exchange='delayed_exchange', routing_key='priority_key')# 发送消息时设置优先级为1
channel.basic_publish(exchange='delayed_exchange', routing_key='priority_key', body='Hello, RabbitMQ!', properties=pika.BasicProperties(priority=1))# 关闭连接
connection.close()

RPC(Remote Procedure Call):允许客户端发送请求消息到服务器端,服务器端处理请求并返回结果消息给客户端。RabbitMQ提供了一个实现RPC的示例。

import pika# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 声明队列
channel.queue_declare(queue='rpc_queue')# 接收到请求时的回调函数
def on_request(ch, method, props, body):n = int(body)# 处理请求response = fibonacci(n)# 返回结果ch.basic_publish(exchange='', routing_key=props.reply_to,properties=pika.BasicProperties(correlation_id=props.correlation_id),body=str(response))ch.basic_ack(delivery_tag=method.delivery_tag)# 定义斐波那契数列函数
def fibonacci(n):if n == 0:return 0elif n == 1:return 1else:return fibonacci(n - 1) + fibonacci(n - 2)# 监听队列
channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='rpc_queue', on_message_callback=on_request)# 开始监听
channel.start_consuming()

示例代码:

import pika
import uuid# 创建连接和通道
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()# 声明队列
channel.queue_declare(queue='rpc_queue')

在消费端,消息确认(Message
Acknowledgement)是一种机制,用于确保消息成功处理,并从队列中删除。RabbitMQ提供了两种消息确认模式:自动确认模式和手动确认模式。在自动确认模式下,消费者在收到消息后立即确认;在手动确认模式下,消费者需要明确地发送确认消息给RabbitMQ,以告诉它该消息已被正确处理。手动确认模式可以确保消息不会在消费者崩溃或网络故障时丢失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MQ回顾之rabbitmq速通

rabbitMQ相对来说功能比较完善,吞吐量会低一点。 持续更新…… 安装 docker 测试选择docker安装 官方安装操作 1、docker pull rabbitmq:latest 2、docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq 3、docker…

springboot mapstruct

官网 官网 官方例子 1.POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

transformer_正余弦位置编码代码笔记

transformer_正余弦位置编码代码笔记 transformer输入的序列中&#xff0c;不同位置的相同词汇可能会表达不同的含义&#xff0c;通过考虑位置信息的不同来区分序列中不同位置的相同词汇。 位置编码有多种方式&#xff0c;此处仅记录正余弦位置编码 正余弦位置编码公式如下&…

idea+javafx的真正打包方式

概述&#xff1a;看到网上很多乱说javafx如何打包的&#xff0c;这里写一篇真正可以打包javafx的。 注&#xff1a;使用java17即使里面没有javafx&#xff0c;也是可以运行javafx项目的&#xff0c;只要你们按照下面一步一步来即可。 第一步&#xff1a;编写一个类去调用主类…

ArXiv| Graph-Toolformer: 基于ChatGPT增强提示以赋予大语言模型图数据推理能力

ArXiv| Graph-Toolformer: 基于ChatGPT增强提示以赋予大语言模型图数据推理能力. 来自加利福利亚大学戴维斯分校计算机科学系的IFM实验室发表在arXiv上的文章:“Graph-ToolFormer: To Empower LLMs with Graph Reasoning Ability via Prompt Augmented by ChatGPT”。 文章的…

2.1总结

还是一样水更一天&#xff0c;就随便做了几个题&#xff0c;有一个周期有点长&#xff0c;后面更一篇长的 随手刷的一道水题&#xff0c;就不往今天的行程单添了 问题&#xff1a;最大公约数 题解&#xff1a;题目太水了&#xff0c;就是求三个数&#xff0c;其中两组的最大公…

PyTorch识别验证码

## 一、生成测试集数据pip install captcha common.py import random import time captcha_array list("0123456789abcdefghijklmnopqrstuvwxyz") captcha_size 4from captcha.image import ImageCaptchaif __name__ __main__:for i in range(10):image ImageC…

2024美赛数学建模C题思路源码

比赛当天第一时间更新&#xff01; 赛题目的 赛题目的&#xff1a; 问题描述&#xff1a; 解题的关键&#xff1a; 问题一. 问题分析 问题解答 问题二. 问题分析 问题解答 问题三. 问题分析 问题解答 问题四. 问题分析 问题解答 问题五. 问题分析 问题解答

this.$store undefined

报错&#xff1a;vuex报错 this.$store显示undefined&#xff0c;可能存在的问题&#xff0c;从以下几个方向排查 1、查看store文件中的vuex实例对象是否暴漏 2、main.js中是否注入store 3、如果上边均没问题&#xff0c;打开package.json&#xff0c;查看vue与vuex的版本&am…

RT-Thread: STM32F103的DAC 操作、DAC驱动

说明&#xff1a;文档记录基于RT-Thread的STM32F103外设DAC操作。 1.DAC的GPIO配置 函数位于 drivers\stm32f1xx_hal_msp.c //DAC底层驱动&#xff0c;时钟配置&#xff0c;引脚 配置 //此函数会被HAL_DAC_Init()调用 //hdac:DAC句柄 void HAL_DAC_MspInit(DAC_HandleTypeDe…

el-upload子组件上传多张图片(上传为files或base64url)

场景&#xff1a; 在表单页&#xff0c;有图片需要上传&#xff0c;表单的操作行按钮中有上传按钮&#xff0c;点击上传按钮。 弹出el-dialog进行图片的上传&#xff0c;可以上传多张图片。 由于多个表单页都有上传多张图片的操作&#xff0c;因此将上传多图的el-upload定义…

Web中的转发与重定向

转发与重定向 一、转发和重定向的概念1.转发2.重定向 二、JavaWeb 中的转发和重定向三、SpringMVC 中的转发和重定向1.转发(1) 默认的方式(2) 完整的方式 2.重定向 四、总结 一、转发和重定向的概念 在 Web 应用中&#xff0c;转发和重定向都是用于将请求从一个页面传递到另一…

09-信息收集-APP及其他资产等

信息收集-APP及其他资产等 信息收集-APP及其他资产等一、APP提取季抓包及后续配合1、某APK一键提取反编译2、利用bp抓取更多URL 二、某IP无web框架下的第三方测试1、各种端口一顿乱扫 —— 思路2、各种接口一顿乱扫 —— 思路3、接口部分一顿测试 —— 思路 三、**案例演示**1、…

【Redis笔记】缓存——缓存分类、更新策略、缓存穿透、缓存雪崩、缓存击穿

缓存 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于高速存储媒介上。 缓存的本质就是用空间换时间&#xff0c;牺牲数据的实时性&#xff0c;以服务器内存中的数据暂时代替从数据库读取最新的数据&#xff0c;减少数据库IO&#…

民事二审案件庭审应如何准备?

一、你要明确审理范围&#xff0c;固定上诉请求 首先&#xff0c;第二审人民法院围绕当事人的上诉请求进行审理。 其次&#xff0c;在第二审程序中&#xff0c;原审原告增加独立的诉讼请求或者原审被告提出反诉的&#xff0c;第二审人民法院可以根据当事人自愿的原则就新增加的…

技术革新与市场需求:探索亚信安慧AntDB的发展之路

在这个信息爆炸的时代&#xff0c;企业对数据处理的需求日益增长&#xff0c;而传统的数据库系统往往难以应对海量数据的存储和处理。亚信安慧AntDB的出现&#xff0c;为解决这一难题提供了有力的工具。它不仅具备高吞吐、高并发、高性能的特点&#xff0c;还拥有极佳的扩展性和…

HTML+JavaScript-05

DOM 什么是 DOM&#xff1f; DOM 是一项 W3C (World Wide Web Consortium) 标准。 DOM 定义了访问文档的标准&#xff1a; “W3C 文档对象模型&#xff08;DOM&#xff09;是中立于平台和语言的接口&#xff0c;它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”…

AI绘画探索人工智能的未来

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-8fL64RHWVzwpzR6m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

SouthLeetCode-打卡24年01月第5周

SouthLeetCode-打卡24年01月第5周 // Date : 2024/01/39 ~ 2024/01/31 031.删除链表的倒数第 N 个结点 (1) 题目描述 031#LeetCode.19.#北岸计划2024/01/29 (2) 题解代码 Version1.0 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if(head …

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法