Python RabbitMQ 六种用法概述

RabbitMQ 是一个开放源代码的消息代理,使用的是先进先出(FIFO)的设计理念,使得消息的传递十分高效。在应用开发中,RabbitMQ 提供了一种可扩展并且高效的通讯手段,尤其适用于分布式系统中的消息传递。在这篇文章中,我们将讨论如何使用 Python 操作 RabbitMQ,并展示六种常见的用法。

环境准备

在开始之前,请确保您已经安装了 RabbitMQ 和 pika 库。可以使用以下命令安装 pika

pip install pika

同时,您需要确保 RabbitMQ 服务正在运行。可以使用以下命令启动 RabbitMQ(假设您已经安装了 RabbitMQ):

rabbitmq-server

1. 基本的发送和接收消息

首先,让我们创建一个简单的 Hello World 消息队列,并实现基本的消息发送和接收。

发送消息的代码示例

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")

connection.close()

接收消息的代码示例

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

def callback(ch, method, properties, body):
    print(f" [x] Received {body}")

channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

2. 持久化消息

可以通过设置消息为持久化来确保在 RabbitMQ 崩溃后消息不会丢失。我们在消息发送时将其持久化。

发送持久化消息的代码示例

channel.queue_declare(queue='durable_queue', durable=True)
channel.basic_publish(exchange='', routing_key='durable_queue', body='Persistent Message', properties=pika.BasicProperties(delivery_mode=2))
print(" [x] Sent 'Persistent Message'")

3. 消费者确认

通过手动确认消息,我们可以避免消息丢失。这在处理长时间运行的任务时特别重要。

消费者确认的代码示例

def callback(ch, method, properties, body):
    print(f" [x] Received {body}")
    ch.basic_ack(delivery_tag=method.delivery_tag)  # 手动确认

4. 消息路由

我们还可以使用 RabbitMQ 的交换机功能实现复杂的路由行为。下面是一个基于路由键的示例。

消息路由的代码示例

channel.exchange_declare(exchange='logs', exchange_type='direct')

channel.queue_declare(queue='info_logs')
channel.queue_bind(exchange='logs', queue='info_logs', routing_key='info')

channel.basic_publish(exchange='logs', routing_key='info', body='Info log message')

5. 主题交换机

主题交换机允许消息按照主题模式路由,使得发送和接收的灵活性更高。

主题交换机的代码示例

channel.exchange_declare(exchange='topic_logs', exchange_type='topic')

channel.queue_declare(queue='error_logs')
channel.queue_bind(exchange='topic_logs', queue='error_logs', routing_key='*.error')

channel.basic_publish(exchange='topic_logs', routing_key='system.error', body='Error log message')

6. 管道模式

管道模式允许多个消费者并发处理入队的消息。以下示例演示了如何使用管道模式。

管道模式的代码示例

def worker(ch, method, properties, body):
    print(f" [x] Working on {body}")
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_qos(prefetch_count=1)  # 确保每个消费者只接收一条消息
channel.basic_consume(queue='task_queue', on_message_callback=worker)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

类图示例

下面是使用 Mermaid 语法的类图示例,展示了 RabbitMQ 消息发送和接收的类关系。

classDiagram
    class MessageSender {
        +sendMessage(queue: String, message: String)
    }
    class MessageReceiver {
        +receiveMessage(queue: String)
    }
    MessageSender --> MessageReceiver : sends >

状态图示例

下面是使用 Mermaid 语法的状态图示例,展示了消息在 RabbitMQ 中的状态转移。

stateDiagram
    [*] --> Ready
    Ready --> Sending: Send message
    Sending --> Acknowledged: Message received
    Sending --> Lost: Message lost
    Ready --> Consuming: Consume message
    Consuming --> Finished: Message processed

结论

通过以上六种基本用法,您可以看到 RabbitMQ 在消息传递中的强大与灵活。无论是基本的消息传递、持久化、确认、消息路由,还是复杂的主题交换与管道模式,RabbitMQ 都能提供丰富的功能来满足不同场景下的需求。结合 pika 库,我们可以方便地在 Python 中高效地操作 RabbitMQ,构建具有高可用性的分布式系统。希望这篇文章能为您理解和使用 RabbitMQ 提供帮助!