RabbitMQ教程入门

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

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 待补充

https://www.rabbitmq.com/tutorials/tutorial-two-python.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值