RabbitMQ 是一个开源的消息队列软件,可以看成为软件层面的路由器,以下是 RabbitMQ 的一些关键特性:
- 消息队列:RabbitMQ 作为一个消息代理,允许应用程序之间交换各种类型的数据。消息被发送到队列,然后被消费者或其他应用程序接收。
- 灵活的路由:RabbitMQ 允许使用各种策略进行消息路由,包括扇出交换(Fanout)、直接交换(Direct)和主题交换(Topic),使得消息能够根据规则被传送到特定的队列中。
- 持久化:RabbitMQ 支持将消息和队列进行持久化,即使在代理重启之后也能保证消息的持久性。
- 可靠性:RabbitMQ 提供了确认机制,确保消息在发送和接收之间的可靠传输。
- 灵活的集成:RabbitMQ 可以与多种编程语言和框架进行集成,包括 Python、Java、Node.js 等。
消息队列是一种通信模式,用于在应用程序之间传递消息。消息队列的作用主要体现在以下几个方面:
- 解耦:消息队列可以将应用程序解耦,使得发送消息的应用程序不需要知道接收消息的应用程序的细节。通过消息队列,发送者和接收者之间可以实现松散的耦合,即使其中一个应用程序出现问题,也不会影响另一个应用程序的运行。
- 异步:消息队列可以实现异步通信,发送者可以将消息发送到队列中之后立即返回,而无需等待接收者处理消息。这种异步通信方式可以提高系统的并发性能和响应速度。
- 消峰:消息队列可以作为缓冲区,用于处理突发的大量消息。如果接收应用程序的处理能力有限,消息队列可以暂存消息,使得发送者能够继续发送消息,而不会因为接收端处理能力不足而丢失消息。
在软件系统中,消息队列常用于微服务架构、异步任务、应用解耦等场景,可以提高系统的可伸缩性、可靠性和灵活性。
安装
如果希望快速体验,可以通过docker镜像安装使用
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management
如果需要手动安装,可以查看官方文档
Hello World示例
生产者往队列写入消息,消费者获取消息
send.py
#!/usr/bin/env python
import pika
# 建立连接
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
# 声明队列
channel.queue_declare(queue='hello')
# 指定消息和队列的对应关系,即将消息存入哪个队列
#(空字符串的默认交换器,允许我们指定消息应发送到哪个队列,队列名称在routing_key中指定)
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
receive.py
#!/usr/bin/env python
import pika, sys, os
def main():
# 建立连接
connection = pika.BlockingConnection(pika.ConnectionParameters(host='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()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('Interrupted')
try:
sys.exit(0)
except SystemExit:
os._exit(0)
运行
shell1 启动消费者
python receive.py
# => [*] Waiting for messages. To exit press CTRL+C
shell2 启动生产者
python send.py
# => [x] Sent 'Hello World!'
输出
shell1
python receive.py
# => [*] Waiting for messages. To exit press CTRL+C
# => [x] Received 'Hello World!'
持久化与公平调度
持久化:通过设置durable=True
和pika.DeliveryMode.Per