一、概述 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queuing Protocol)的开源实现。AMQP,即高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。服务器端是用Erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面具有良好的表现。 二、应用场景对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability);如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:
1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失? 2)如何降低发送者和接收者的耦合度? 3)如何让优先级高的接收者先接到数据? 4)如何做到负载均衡?有效均衡接收者的负载? 5)如何有效的将数据发送到相关的接收者?也就是说将接收者订阅的不同数据,如何做有效的过滤。 6)如何做到可扩展,甚至将这个通信模块发到cluster上? 7)如何保证接收者接收到了完整,正确的数据? AMDQ协议解决了以上的问题,而RabbitMQ实现了AMQP。 三、服务结构rabbitmq的框架如下:
几点解释:
rabbitmq server:是一种传输服务,维护从生产者到消费者的二路线,保证数据能按照指定方式进行传输。
clientA和clientB:即为生产者,数据的发送方。有两部分:payload(有效载荷)和label(标签),payload是传输的数据,label是标签,用于描述数据。而rabbitmq也是通过label来决定把信息发送给哪个消费者。
client1,client2,client3:即为消费者,数据的接收方。当信息到达队列之后,rabbitmq会依次发送给每一个订阅此信息的消费者,发送给消费者时会删掉信息的标签,对消费者来说自己不知道谁发送的信息。特定情况比如发送的数据包含生产者的信息时另当别论。
数据从生产者到消费者的传递,有几个概念:exchanges, queues和bindings。
Exchanges(交换器):是生产者发布信息的地方,由exchange将消息路由到一个或多个队列中。
queue(队列):是rabbitmq的内部对象,用于存储消息,rabbitmq中的消息都只能存储在队列中,生产者的消息最终都到queue中,消费者可根据订阅从queue中获取消息。
binding(绑定):通过binding将exchange和queue关联起来,这样rabbitmq就知道如何正确地将消息路由到指定的队列了。
需要知道的两个概念:
connection:生产者和消费者之间,使用TCP进行连接到rabbitmqserver的。
channels:虚拟连接,在TCP连接中,数据流是在channel中进行的。
四、应用安装指南安装环境:CentOS6.8
4.1 安装erlang
4.2 安装rabbitmq 首先导入rabbitmq的公钥,不安装密钥的话安装rabbitmq会报错 报错:warning: rabbitmq-server-3.6.6-1.el6.noarch.rpm: Header V4 RSA/SHA1Signature, key ID 6026dfca: NOKEY
本次下载的是3.6.6版本 1
2
| wget
rpm -ivh rabbitmq-server-3.6.6-1.el6.noarch.rpm
|
安装过程中可能会报错,如: error: Faileddependencies: socat is needed byrabbitmq-server-3.6.6-1.el6.noarch 原因是缺少socat包,安装即可(需要epel扩展源):
此次安装使用的不是全新的系统,有部分相关包已经安装完,故实际操作中根据实际问题安装相应的依赖包。
node : rabbit@rabbit01 home dir : /var/lib/rabbitmq config file(s) :/etc/rabbitmq/rabbitmq.config cookie hash : +aRq6ISnMthDGwICCmjvGw== log : /var/log/rabbitmq/rabbit@rabbit01.log sasl log : /var/log/rabbitmq/rabbit@rabbit01-sasl.log databasedir : /var/lib/rabbitmq/mnesia/rabbit@rabbit01
设置环境变量可以创建一个rabbitmq-env.conf文件,rabbitmq的环境变量都是有“RABBITMQ_”这样的前缀的,在配置文件里配置变量时要把前缀去掉,如: #Rename the node NODENAME=rabbit@rabbit01 #Config file location and new filename bunnies.config CONFIG_FILE=/etc/rabbitmq/
一般情况,不需要设置环境变量,使用默认就可以,除非有非标准的需求。
配置文件的示例文件在/usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example,可以拷贝到/etc/rabbitmq/下并改名将example去掉: cp/usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example/etc/rabbitmq/rabbitmq.config
此配置文件的内容为示例内容,可根据需求进行改动
rabbitmq的端口比较多,系统的一些防护机制很可能会有影响,比如selinux,iptables等,以下端口是默认端口: 4369[empd]:是erlang集群节点间端口映射的守护进程,负责维护集群内的节点连接,提供节点名称到IP地址及端口的解析服务。 5672, 5671:tcp和ssl的侦听端口 25672:管理插件端口,默认是AMQP端口+20000 1883, 8883:如果MQTT启用的话会用到此端口,MQTT(消息队列遥测传输,是一个即时通讯协议)
在生产上,可能会有大并发连接和队列,使用系统默认的最大打开文件数可能不足以应付高并发,所以需要将最大打开文件数做修改,默认为1024,可用ulimit -n查看,一般情况设置为4096就足以满足大多数工作负载: ulimit -S-n 4096
|