简介 RabbitMQ(消息队列/消息中间件)是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现。用Erlang语言开发。RabbitMQ具有良好的性能和实效性,同时还支持集群和负载部署,非常适用于在较大规模的分布式系统中使用。 Java常见的消息队列技术:RabbitMQ、ActiveMQ、Redis(List数据格式)、JMS(Java Message Service)等。 RabbitMQ官网:http://www./ 消息队列比较:http://blog.csdn.net/sunxinhere/article/details/7968886 RabbitMQ下载地址:http://www./download.html 安装 安装erlang依赖。
下载erlang的仓库: wget http://packages./erlang-solutions-1.0-1.noarch.rpm (如果提示wget不是一个命令执行yum install wget) 安装erlang仓库:rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
安装RabbitMQ
(*.tar.xz 需要使用xz -d 解压后在 tar -xf 解压) (安装xz: yum install xz.x86_64)① ② xz -d rabbitmq-server-generic-unix-3.6.12.tar.xz
RabbitMQ配置 启动RabbitMQ后执行:
消息队列运行原理 从上图可以看出、生产者、消息队列、消费者是最重要的三个概念: 生产者(Producer):创建消息到消息队列中。 消息队列(Queue):存储消息。 消费者(Consumer):监听指定消息队列,当消息队列接收到消息后,获取消息并处理。 RabbitMQ:创建消息队列,并提供API给生产者和消费者进行存取消息。 生产者产生消息并调用RabbitMQ的API将消息加入到对应的消息队列中,消费者通过RabbitMQ的API从消息队列中获取消息进行消费。 RabbitMQ核心 RabbitMQ的核心由虚拟机、交换机、队列、绑定这四部分组成。 虚拟机(Virtual Host) 在RabbitMQ中虚拟机主要是用于控制权限颗粒度,RabbitMQ默认的虚拟机路径为/。一个虚拟机包含一组交换机、队列和绑定。 例如admin的virtual host为/、zs的virtual host为/test。假设RabbitMQ Server中有/test /hello /demo,那么admin可以操作全部虚拟机下的队列而zs只可以操作/test下的队列。 交换机/路由器(Exchange) RabbitMQ中的交换机本身并不进行消息的存储,主要用做进行消息的转发到指定规则的队列内。生产者在传递消息时并不是直接传到队列中,而是先发送给交换机,交换机会通过消息中的routing_key按照特定的路由算法转发给路由绑定的对应队列。Exchange可以和多个Queue绑定,Exchange本身也可以进行持久化、临时、自动删除。 路由规则 直接交换器(Dirct) Dirct的工作方式类似单播,Exchange会将x消息转发至ROUTING_KEY完全匹配的队列中。 广播交换器(Fanout) Fanout的工作方式就是广播,Exchange会将消息转发至所有与其绑定的队列中,而不管ROUTING_KEY的是什么。 主题交换器(Topic) Topic的工作方式是模糊匹配,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列。比如ROUTING_KEY为user.dj的Message会转发给绑定匹配模式为包含*user.dj*的队列( * 表是匹配一个任意词组,#表示匹配0个或多个词组)。 头交换机(Headers)[了解] Headers类型的exchange使用的比较少,它也是忽略routingKey的一种路由方式。是使用Headers来匹配的。Headers是一个键值对,可以理解成Hashtable。发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。这两种方式是在接收端必须要用键值''x-mactch''来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange则没有这个要求,因为键值对的值可以是任何类型。 绑定binding 所谓的binding就是将交换机与一个特定的队列绑定起来,且交换机与队列的关系可以是一对一、一对多、多对多。 消息队列(queue) Queue是用来存储消息的容器,RabbitMQ提供了FIFO(先进先出)的机制,可以缓存消息也可以将消息持久化、临时或者自动删除。 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统奔溃后数据丢失。 设置为临时队列,queue中的数据在系统重启之后就会丢失 设置为自动删除的队列,当不存在用户(生产者和消费者)连接到server,队列中的数据会被自动删除。 (消费者消费完消息后消息就不存在了和设置了什么状态无关) Message(消息体) Message:由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的数据。 通信过程 假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:
Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:
|
|