RabbitMQ 的安装以及介绍

RabbitMQ

简介

RabbitMQ(消息队列/消息中间件)是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现。用Erlang语言开发。RabbitMQ具有良好的性能和实效性,同时还支持集群负载部署,非常适用于在较大规模的分布式系统中使用。

Java常见的消息队列技术:RabbitMQ、ActiveMQ、Redis(List数据格式)、JMS(Java Message Service)等。

RabbitMQ官网:http://www.rabbitmq.com/

消息队列比较:http://blog.csdn.net/sunxinhere/article/details/7968886

RabbitMQ下载地址:http://www.rabbitmq.com/download.html

安装

安装erlang依赖。

  1. 安装erlang的rpm库。

下载erlang的仓库:             

wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm (如果提示wget不是一个命令执行yum install wget)

安装erlang仓库:rpm -Uvh erlang-solutions-1.0-1.noarch.rpm

  1. 安装erlang:yum install erlang

安装RabbitMQ

  1. 解压rabbitmq-server-generic-unix-3.6.12.tar.xz。

(*.tar.xz 需要使用xz -d 解压后在 tar -xf 解压)

(安装xz: yum install xz.x86_64)①

② xz -d  rabbitmq-server-generic-unix-3.6.12.tar.xz

  1. 进入sbin目录启动rabbitMQ:./rabbitmq-server start

 

RabbitMQ配置

启动RabbitMQ后执行:

  1. ./rabbitmqctl add_user admin 123456(创建用户)
  2. ./rabbitmqctl set_user_tags admin administrator(将创建好的用户加入管理员)
  3. ./rabbitmqctl set_permissions -p "/" admin "." "." ".*"(授权)
  4. ./rabbitmq-plugins enable rabbitmq_management 启动RabbitMQ管理页面
  5. 重启MQ服务、开放5672/15672/25672端口。在浏览器输入ip:15672后出现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:由HeaderBody组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的数据。

通信过程

假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:

  1. P1生产消息,发送给服务器端的Exchange。
  2. Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1。
  3. Queue1收到消息,将消息发送给订阅者C1。
  4. C1收到消息,发送ACK给队列确认收到消息。
  5. Queue1收到ACK,删除队列中缓存的此条消息

Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:

  1. 如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
  2. 如果cosumer接受了消息, 但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在consumer在次连接的时候,这条消息会被redeliver。
  3. 如果consumer接受了消息,但是程序中有bug,忘记了ack,rabbitmq不会重复发送消息。
  4. rabbitmq2.0.0和之后的版本支持consumer reject某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。

猜你喜欢

转载自blog.csdn.net/Xiayubing_/article/details/81288607