1、RabbitMQ 简介:
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ是一个消息代理:主要作用就是接受并转发消息。 可以将其视为邮局:将要发布的邮件放在邮箱中时,可以确保最终将邮件传递给收件人。 以此类推,RabbitMQ可以看成是一个邮政信箱,一个邮局和一个邮递员的总集。RabbitMQ与邮局之间的主要区别在于,它不处理纸张,而是接收,存储和转发二进制的数据消息。
2、RabbitMQ中的一些概念:
- Broker:简单来说就是消息队列服务器实体。
- Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
- Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
- Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
- Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
- vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
- producer:消息生产者,就是投递消息的程序。
- consumer:消息消费者,就是接受消息的程序。
- channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
3、RabbitMQ工作原理
MQ 是消费 - 生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。生产者把消息发送到交换机,交换机与队列的绑定关系决定了消息如何路由到特定的队列 。在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别:
Direct 直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue;
Fanout 广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。
Topic 主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和#.user.stock.#的队列。( * 表是匹配一个任意词组,#表示匹配0个或多个词组)
4、环境安装RabbitMQ,以及python用例所需要的pika模块
docker pull rabbitmq:management
docker run -d --name rabbitmq-test -p 15672:15672 -p 5672:5672 rabbitmq:management
python3 -m pip install pika


此时访问服务器的15672端口,用户密码都是guest。可以登录web界面

4、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")
channel.basic_publish(exchange="", routing_key="hello", body="Hello World!")
print(" [x] Sent 'Hello World!'")
connection.close()
执行之后会有queue出现


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(
queue="hello",
on_message_callback=callback,
auto_ack=True
)
print(" [*] Waiting for message. To exit press CTRL+C")
channel.start_consuming()
执行之后,可以看到connection、channel的信息


5、work queue 待补充
本文是RabbitMQ的入门教程,介绍了RabbitMQ的基本概念,如Broker、Exchange、Queue、Binding,以及工作原理。讲解了Exchange的4种类型:Direct、Fanout、Topic和Headers,并提供了环境安装和Python使用示例。
51万+

被折叠的 条评论
为什么被折叠?



