一、RabbitMQ介绍
RabbitMQ 是高级消息队列协议(AMQP)的开源消息代理软件。可用于数据投递,非阻塞操作或推送通知,实现发布 / 订阅,异步处理,或者工作队列;
优点:
- 可靠性:RabbitMQ 提供了各种功能,让你权衡性能与可靠性,其中包括持久性,交付确认和高可用性。
- 灵活的路由:消息在到达队列之前,通过交换机的路由。RabbitMQ 为典型的路由逻辑提供了几个内置的交换机类型。对于更复杂的路由,则可以绑定几种交换机一起使用甚至可以自己实现交换机类型,并且把它作为一个插件的来使用。
- 集群:在本地网络上的几个 RabbitMQ 服务器可以聚集在一起,作为一个独立的逻辑代理来使用。
- 联合:对于服务器来说,它比集群需要更多的松散和非可靠链接。为此 RabbitMQ 提供了联合模型。
- 高度可用队列:在群集中,队列可以被镜像到几个机器中,确保您的消息即使在出现硬件故障的安全。
- 多协议:RabbitMQ 支持上各种消息传递协议的消息传送.
- 许多客户端:有你能想到的几乎任何语言 RabbitMQ 客户端。
- 管理用户界面:RabbitMQ 附带一个简单使用管理用户界面,允许您监视和控制您的消息代理的各个方面。
- 追踪:如果您的消息系统行为异常,RabbitMQ 提供跟踪支持,让你找出问题是什么。
- 插件系统:RabbitMQ 附带各种插件扩展,并且你也可以写你自己插件.
二、软件安装
系统环境:Ubuntu
sudo apt-get install –y rabbitmq-server; 安装服务
sudo service rabbitmq-server start;启动服务
如果要调整系统限制,比如打开文件的句柄数量
可以编辑/etc/default/rabbitmq-server 注释 unlimit –n 1024;
less /var/log/rabbitmq/rabbitmq@主机名.log ;查看rabbitmq的日志;
- RabbitMQ 使用的是 AMQP 协议。要使用 rabbitmq,你需要一个库来解读这个协议。几乎所有的编程语言都有可选择的库。python 也是一样,可以从以下几个库中选择,他们都可以实现 python 与 rabbitmq 的对接:
- py-amqplib
- txAMQP
- pika
示例使用pika库进行连接AMQP协议
# 更新软件包列表
sudo apt-get update
# 安装所需要的依赖
sudo apt-get install -y python-pip git-core
# 更新 pip
sudo pip install --upgrade pip
# 安装 pika
sudo pip3 install pika
三、角色与配置
- 发布者(producer):发布消息的应用程序
- 队列(queue):用于消息存储的缓冲
- 消费者(consumer):接收消息的应用程序
发布者(producer)只需把消息发送给一个交换机(exchange)。交换机非常简单,它一边从发布者接收消息,一边把消息消息推送到队列。交换机必须知道如何处理它接收的消息,是应该推送到指定的队列还是多个队列,或者是直接忽略消息。这些规则是通过交换机类型(exchange type)来定义的。
扇形交换机(fanout)很简单,你可能从名字上就能猜测出来,它把消息发送给所有的队列,这是我们日志系统所需要的。
channel.exchange_declare(exchange='logs', exchange_type='fanout')
使用 basic.qos
方法,并设置 prefetch_count=1
。这样是告 RabbitMQ ,再同一时刻,不要发送超过 1 条消息给一个工作者(worker),直到它已经处理了上一条消息并且作出了响应。这样,RabbitMQ 就会把消息分发给下一个空闲的工作者(worker)
channel.basic_qos(prefetch_count=1)
查看交换机 :
sudo service rabbitmq-server start;启动
sudo rabbitmqctl list_exchanges ;查看交换机列表
exchange 参数就是交换机的名字。空字符串代表默认或者匿名交换机:消息将会根据指定的 routing_key 分发到指定的队列
channel.basic_publish( exchange='logs', routing_key='hello',body=message)
消息属性
AMQP协议给消息预定义了一系列的14个属性。大多数属性很少会用到,除了以下几个:
- delivery_mode(投递模式):将消息标记为持久的(值为2)或暂存的(除了2之外的其他任何值)。
- content_type(内容类型):用来描述编码的mime-type。例如在实际使用中常常使用application/json来描述JOSN编码类型。
- reply_to(回复目标):通常用来命名回调队列。
- correlation_id(关联标识):用来将RPC的响应和请求关联起来。