二、RabbitMQ详解

1、RabbitMQ介绍

RabbitMQ是一个在AMQP(Advanced Message Queuing Protocol)基础上实现的,可复用的企业消息系统。它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客户端如

Python.

Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。它同时实现了一个Broker构架,这意味着消息在发送给客户端时先在中心队列排队,对路由(Routing)、负载均衡(Load balance)或者数据持久化都有很好的支持。

2、RabbitMQ特点

  • 可靠性
  • 灵活的路由
  • 扩展性
  • 高可用性
  • 多种协议
  • 多语言客户端
  • 管理界面
  • 插件机制

2、AMQP介绍

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

4、什么是消息队列

MQ全称为Message Queue,消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

消息队列的使用场景是怎样的?

5、RabbitMQ应用场景

对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component orsubmodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalability)﹔如果使用socket那么不同的模块的确可以部署到不同的机器上,但是还是有很多问题需要解决。比如:

1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何方式丢失?

2)如何降低发送者和接收者的耦合度?

3)如何让Priority高的接收者先接到数据?

4)如何做到load balance?有效均衡接收者的负载?

5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,如何做有效的filter。

6)如何做到可扩展,甚至将这个通信模块发到cluster上?

7)如何保证接收者接收到了完整,正确的数据?

AMDQ协议解决了以上的问题,而RabbitMQ实现了AMQP

6、RabbitMQ概念介绍

  • Broker:简单来说就是消息队列服务器实体。
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
  • producer:消息生产者,就是投递消息的程序。
  • consumer:消息消费者,就是接受消息的程序。
  • channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

RabbitMO从整体上来看是一个典型的生产者消费者模型,主要负责接收、存储和转发消息

7、RabbitMQ使用流程

AMQP模型中,消息在producer中产生,发送到MQ的exchange上,exchange根据配置的路由方式发到相应的Queue上,Queue又将消息发送给consumer,消息从queue到consumer有push和pull两种方式。消息队列的使用过程大概如下:

1.客户端连接到消息队列服务器,打开一个channel。

2.客户端声明一个exchange,并设置相关属性。

3.客户端声明一个queue,并设置相关属性。

4.客户端使用routing key,在exchange和queue之间建立好绑定关系。

5.客户端投递消息到exchange。

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。

三、RabbitMQ单机安装部署

1、Windows上安装(略)

2、Linux上安装

1、安装erlang

添加YUM支持

  1. [ root@qfedu.com ~]# cd /usr/local/src/
  2. [ root@qfedu.com ~]# mkdir rabbitmq
  3. [ root@qfedu.com ~]# cd rabbitmq
  4. [ root@qfedu.com ~]# wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
  5. [ root@qfedu.com ~]# rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
  6. [ root@qfedu.com ~]# rpm --import http://packages.erlang-solutions.com/rpm/erlang_solutions.asc
  7. [ root@qfedu.com ~]# yum install erlang

2、安装RabbitMQ

1、用YUM安装RabbitMQ

  1. [rooteqfedu.com ~]# rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-rey.asc
  2. # this example assumes the Centos 7 version of the package
  3. [rooteqfedu.com ~]# yum install rabbitmq-server-3.7.13-1.el7.noarch.rpm
  1. [root@qfedu.com ~]# rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
  2. # this example assumes the Centos 7 version of the package
  3. [rooteqfedu.com ~]# yum install rabbitmq-server-3.7.13-1.el7.noarch.rpm

2、用RPM手动安装

1、下载安装包
  1. [ root@qfedu.com ~]# wget https://github.com/rabbitmq /rabbitmq-server/releases/download/v3.7.13/rabbitmq-server-3.7.13-1.el7.noarch.rpm

上传rabbitmq-server-3.7.13-1.el7.noarch.rpm文件到/usr/local/src/rabbitmq/

2、安装
  1. rpm -ivh rabbitmq-server-3.7.13-1.el7.noarch.rpm
3、常用命令
  1. service rabbitrlq-server start
  2. service rabbitmq-server stop
  3. service rabbitmq-server restart
  4. chkconfig rabbitmq-server on # 设置开机自启
4、设置配置文件
  1. [ root@qfedu.com ~]# cd /etc/rabbitmq
  2. [ root@qfedu.com ~]# cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example/etc/rabbitmq /
  3. [ root@qfedu.com ~]# mv rabbitmq.config.example rabbitmq.config
5、设置用户远程访问

RabbitMQ - 图1

6、开启web界面管理工具
  1. rabbitmq-plugins enable rabbitmq management
  2. service rabbitmg-server restart