1 RabbitMQ能为我们带来什么?
它是一个消息系统,消息系统允许软件、应用相互连接和扩展。RabbitMQ是一种流行的开源消息队列系统,它实现了高级消息队列协议(AMQP),消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶。解耦体现在它的模型架构,RabbitMQ的主要组件包括生产者、消费者和代理,代理负责将消息路由到相应的消费者,这种模型允许应用程序在不直接依赖彼此的情况下进行通信。RabbitMQ有着运行在所有Erlang所支持的平台之上的潜力,从嵌入式系统到多核心集群还有基于云端的服务器。
在云场景中,RabbitMQ可以应用于各种不同的场景和用例。以下是一些常见的云场景中使用RabbitMQ的应用:
异步任务处理:云环境通常需要处理各种异步任务,例如后台处理、数据处理和批处理作业等。RabbitMQ可以作为任务队列,接收和分发任务,允许通过异步方式处理任务,提高系统的响应性能和可伸缩性。
分布式系统通信:云环境中的分布式系统通常需要进行可靠的消息传递和协调。RabbitMQ提供了可靠的消息传递机制,可以在不同的服务之间进行异步通信,实现解耦和灵活性。
事件驱动架构:在云环境中,基于事件的架构模式越来越受欢迎。RabbitMQ可以作为事件总线,用于发布和订阅事件。各个服务可以通过订阅感兴趣的事件来实现解耦和灵活的事件驱动通信。
日志收集和分发:在云环境中,大量的应用程序和服务生成日志数据。RabbitMQ可以作为中心化的日志收集和分发系统,将日志消息发送到相应的消费者进行处理和存储,实现集中化的日志管理。
微服务架构:微服务架构在云环境中得到广泛应用,而消息队列是实现微服务之间通信的一种常见方式。RabbitMQ可以用于微服务之间的消息传递,实现松耦合、可靠的微服务通信和协调。
2 RabbitMQ的工作机制是什么?
RabbitMQ是一个消息代理。它的工作就是接收和转发消息。可以拿邮局来比喻消息代理的功能:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。
RabbitMQ和邮局的主要区别在于,它不是像邮局一样处理纸张,而是接收、存储和发送消息(message)这种计算机通用的二进制数据。
下面是RabbitMQ和消息所涉及到的一些术语。
生产(Producing)的意思就是发送。发送消息的程序就是一个生产者(producer)。我们一般用”P”来表示。
队列(queue)就是存在于RabbitMQ中邮箱的名称。虽然消息的传输经过了RabbitMQ和你的应用程序,但是它只能被存储于队列当中。实质上队列就是个巨大的消息缓冲区,它的大小只受主机内存和硬盘限制。多个生产者(producers)可以把消息发送给同一个队列,同样,多个消费者(consumers)也能够从同一个队列(queue)中获取数据。队列可以绘制成这样(图上是队列的名称):
消费(Consuming)和接收(receiving)是同一个意思。一个消费者(consumer)就是一个等待获取消息的程序。一般用“C”来表示。
3 使用python实现一个简单的RabbitMQ程序
1)前置准备:
如果想在python中通过pika 0.10.0 Python客户端实现一个简单的RabbitMQ程序,需要先拥有一个可以联网的RabbitMQ服务器,为了方便试验,我在本地安装了rabbit-server。
安装步骤如下:
a. 下载以下安装包
b. 解压后安装即可,先安装erlang再安装rabbitmq,安装完成之后需要在本地配置环境变量。
c. 进入rabbitmq-server安装目录下的sbin目录,执行 rabbitmq-plugins enable rabbitmq_management(window系统和linux系统命令可能稍有区别,通过查看sbin目录可以观察到)来安装插件,完成之后启动rabbit服务器即可。其他rabbitmq相关命令可以在网上搜索到相关资料。
2) Python程序实现简单rabbitmq通信:
Send.py:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello') #创建一个名为”hello”的队列用来将消息投递进去
channel.basic_publish(exchange='',
routing_key='hello',
body='welcome to you!') #通过交换机将消息发送到队列中
print(" [x] Sent 'welcome to you!'")
connection.close()
以上python程序会发送一个消息到队列中。首先要做的事情就是建立一个到RabbitMQ服务器的连接。现在我们已经跟本地机器的代理建立了连接。如果你想连接到其他机器的代理上,需要把代表本地的localhost改为指定的名字或IP地址。
Receive.py:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
print(" [x] Received %r" % body) #回调函数显示消息
channel.basic_consume('hello',callback) #回调函数接收消息的队列
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
运行receive.py,会持续运行,等待消息,下图显示接收程序已经接收到了一条消息,为send端发送的。
运行send.py发送指定消息。
参考:应用教程 - Python版 - Hello World - 《RabbitMQ 中文文档》 - 书栈网 · BookStack