RabbitMQ的消息确认模式

本文介绍了RabbitMQ中消息的两种确认模式:自动模式下无论消费者是否成功处理消息,服务端均认为消息已被成功处理;手动模式下,消费者获取消息后,服务器将消息标记为不可用并等待消费者的反馈。

一 概述

生产者发送消息后,这个消息的确认对于MQ来说,MQ会拥有自己的确认模式来完成。

二 RabbitMQ的消息确认模式

当我们发送消息后,服务端如何知道消息已经被消费。

模式1:自动模式,不管消费者获取到消息之后是否是成功处理消息,服务端都认为成功的。

模式2:手动模式,消费者获取到消息之后,服务器会将消息标记为不可用,等待消费者反馈,如果不反馈,则一直标记为不可用。

 

 

### RabbitMQ 3.6 版本的消息模式使用说明 RabbitMQ 是一种基于 AMQP 协议的消息中间件,支持多种消息传递模式。以下是关于 RabbitMQ 3.6 版本中常见的几种消息模式及其使用方法: #### 1. 简单模式 (Simple Mode) 简单模式是最基础的工作方式,在这种模式下,生产者将消息发送到队列,消费者从该队列中获取并处理消息。此模式适用于简单的点对点通信场景。 - 生产者通过指定队列名称向目标队列发送消息。 - 消费者监听特定队列,并从中消费消息。 示例代码如下: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明队列 channel.queue_declare(queue='simple_queue') # 发送消息 message = 'Hello, Simple Queue!' channel.basic_publish(exchange='', routing_key='simple_queue', body=message) print(f"Sent message: {message}") connection.close() ``` --- #### 2. 工作模式 (Work Queues / Task Queues) 工作模式允许多个消费者共同分担同一个队列中的任务负载。在这种情况下,多个消费者可以并发地从同一队列中拉取消息,从而实现任务分配负载均衡[^4]。 - 队列中的每条消息只会被其中一个消费者接收。 - 如果某个消费者未能完成任务,则可以通过设置 `no_ack=False` 来重新排队未成功处理的消息。 示例代码如下: ```python def callback(ch, method, properties, body): print(f"Received task: {body.decode()}") ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_consume(queue='work_queue', on_message_callback=callback, auto_ack=False) channel.start_consuming() ``` --- #### 3. 发布/订阅模式 (Publish/Subscribe) 发布/订阅模式允许一个生产者将消息广播给多个消费者。在此模式下,生产者不会直接将消息发送至队列,而是将其发送到交换器(Exchange),由 Exchange 负责将消息转发到绑定的队列上。 - 创建 Fanout 类型的 Exchange。 - 多个队列可以绑定到同一个 Exchange 上,所有绑定的队列都会收到相同的消息副本。 示例代码如下: ```python # 生产者 channel.exchange_declare(exchange='logs', exchange_type='fanout') message = 'Broadcast log message' channel.basic_publish(exchange='logs', routing_key='', body=message) # 消费者 result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue channel.queue_bind(exchange='logs', queue=queue_name) ``` --- #### 4. 路由模式 (Routing) 路由模式扩展了发布/订阅模式的功能,它引入了 Routing Key 的概念。生产者在发送消息时会附加一个 Routing Key,而 Exchange 则根据这个键决定将消息投递给哪些队列。 - 定义 Direct 类型的 Exchange。 - 不同队列可以根据不同的 Binding Key 绑定到 Exchange 上。 示例代码如下: ```python # 生产者 routing_key = 'info' channel.basic_publish(exchange='direct_logs', routing_key=routing_key, body=message) # 消费者 binding_keys = ['error', 'warning'] for binding_key in binding_keys: channel.queue_bind(exchange='direct_logs', queue=queue_name, routing_key=binding_key) ``` --- #### 5. 主题模式 (Topic) 主题模式是一种更灵活的路由机制,其中 Routing Key 可以包含通配符(如 `*` `#`)。这使得 Exchange 能够匹配复杂的规则来分发消息。 - 使用 Topic 类型的 Exchange。 - 支持部分匹配 (`*`) 或完全匹配 (`#`) 的 Binding Keys。 示例代码如下: ```python # 生产者 routing_key = 'kern.critical' channel.basic_publish(exchange='topic_logs', routing_key=routing_key, body=message) # 消费者 bindings = ['#.critical', '*.debug'] for b in bindings: channel.queue_bind(exchange='topic_logs', queue=queue_name, routing_key=b) ``` --- #### 6. RPC 请求响应模式 (Remote Procedure Call) RPC 模式用于实现远程过程调用功能。客户端发送请求后等待服务器返回结果;为了区分不同请求的结果,通常会在每次请求时创建一个新的临时回调队列。 示例代码如下: ```python correlation_id = str(uuid.uuid4()) properties=pika.BasicProperties(reply_to=result.method.queue, correlation_id=correlation_id) channel.basic_publish(exchange='', routing_key='rpc_queue', properties=properties, body=str(n)) ``` --- #### 7. 发布确认模式 (Publisher Confirms) 发布确认模式确保生产者的每一条消息都被正确交付到至少一个符合条件的队列中。如果无法满足条件,消息会被退回给生产者。 启用 Confirm 模式的配置如下: ```python channel.confirm_delivery() if channel.is_open: try: channel.basic_publish(exchange='my_exchange', routing_key='key', body='Message content', mandatory=True) except Exception as e: print("Message could not be delivered:", e) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值