RabbitMQ系列(一)——了解和安装RabbitMQ中间件
前言
对于中型乃至大型项目,使用消息队列(MQ)可以使我们较好地处理高并发且时效性要求不高的业务场景,同时MQ还可以让我们的代码解耦,更加灵活。虽然Redis等其他一些中间件应用提供了类似MQ的功能,但由于其稳定性和对事务的支持性上没有专门的MQ中间件这么出色,所以一般来说我们更多的还是采用MQ中间件来处理外部系统的信息。本篇文章作为
RabbitMQ
的起始篇,将对RabbitMQ的特性进行介绍,并且将对Linux系统上安装RabbitMQ的步骤进行讲解,希望对大家有所帮助。
说在前面
在正式开始RabbitMQ的学习之前,我们且来简单回顾一下什么是MQ?
MQ是Message Queue的缩写,即信息队列,而说到队列其实就是一种先进先出的数据模型。常见的就是(信息)生产者不直接将信息交由消费者,而是投递到MQ队列中,再由队列转发到订阅对应队列的消费者手中。MQ具备的异步、削峰、解耦三大特点使得我们在一些高并发、业务拆分等场景下提供了更加灵活的解决方案。
一、常见的MQ产品
(一)ActiveMQ
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,并且它一个完全支持JMS规范的消息中间件。其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛!
实际上,ActiveMQ在早些时候由于其丰富的API和开源免费的特点,使得其受到广大Java程序员的使用,市场占用率很高。但后面由于市场上有了Kafka、RocketMQ等其他性能更好的MQ中间件之后,相对来说该款中间件新项目使用的比例已经不高了。
(二)Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
(三)RocketMQ
RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache顶级项目,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
RocketMQ可以说是集稳定性、高效性为一体,应该是目前来说市面上最好的MQ产品之一,但缺点也比较明显:RocketMQ并不是完全免费的,而是根据使用的功能以及频率来进行收费,对于小型项目来说,可能由于够不到其最低的消费限额,所以可能不用钱。但如果是mq使用频率比较高的项目的话,还是建议根据实际所需的费用来进行技术成本评估。
(四)RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
稳定、开源、成熟的社区是我们选择RabbitMQ来进行讲解的原因之一,实际上除了了解常见的API和核心概念,我们更多的还是要学习对如何保障信息被消费、如何处理死信队列等常见的场景。而RabbitMQ是一个较好的示范用例。
二、RabbitMQ的安装和简单使用
这里将简单演示一下如何在Linux环境下安装3.6.5版本的RabbitMQ,注意安装RabbitMQ可以有多种方式,这里的话选择较为简单的RPM安装方式
步骤一:准备好安装rabbitmq所需要的rpm包
首先RabbitMQ的安装除了本身自己的安装包之外,还需要准备2个依赖包,分别是erlang
和socat
步骤二:依次安装erlang、socat和rabbitmq-server安装包
需要注意,由于rabbitmq-server依赖了erlang和socat,所以后两者的安装顺序要在rabbitmq-server安装之前
# 使用 rpm -ivh命令分别进行应用安装
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
步骤三:修改rabbitmq核心配置文件
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
步骤四:启动RabbitMQ
服务
当我们使用rpm的安装方式来安装RabbitMQ,那么安装成功后,就可以通过rabbitmq-server
、rabbitmqctl
、rabbitmq-plugins
这三个命令前缀来根据需要执行不同的命令。
一般来说,rabbitmq-plugins
这个命令主要用于管理RebbitMQ的插件,rabbitmq-server
命令一般用于启动服务,而相对来说使用最为频繁的命令是rabbitmqctl
,我们常常用这个命令来进行用户管理、队列管理等基础操作。
# 后台启动rabbitmq服务
rabbitmq-server start &
三、RabbitMQ的核心概念
(一)AMQP协议
我们在前面RabbitMQ的简介中介绍过,RabbitMQ是遵循AMQP协议实现的,那AMQP协议是什么呢?
AMQP
是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。简单来说,AMQP协议就是专门针对消息队列中间件而制定的一系列开发标准协议。
上图是AMQP协议模型图,我们可以看到模型中主要存在三个参与者:生产者(Publisher application)和消费者(Consumer application)以及MQ服务器Server。而Server中由一个或者多个虚拟主机(Virtual host)组成,可以用来进行多套路由配置的逻辑隔离(相当于是Redis中会逻辑上划分为16个数据库)。而每个虚拟主机中又有若干个交换机(Exchange)和队列(Queue),用于信息(Message)的转发。
关于AMQP协议,还有一些名词需要我们了解一下:
名称 | 作用 |
---|---|
Server | 又称Broker,接受客户端的连接,实现AMQP实体服务 |
Connection | 连接,应用程序与Broker的网络连接 |
Channel | 网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。 |
Message | 消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容。 |
Virtual host | 虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个VirtualHost里面不能有相同名称的Exchange或Queue |
Exchange | 交换机,接收消息,根据路由键转发消息到绑定的队列 |
Binding | Exchange和Queue之间的虚拟连接, binding中可以包含routing key |
Routing key | 一个路由规则,虚拟机可用它来确定如何路由一个特定消息 |
Queue | 也称为Message Queue,消息队列,保存消息并将它们转发给消费者 |
(二)RabbitMQ的信息流转过程和Exchange存在的意义
下面的信息流转图描述了RabbitMQ中信息的流转过程,我们可以看到Message并不是直接就流转到队列Queue中,而是先经过了交换机Exchange,可能有些读者会有所疑惑,这里的交换机存在的意义是什么?直接把信息发送到队列中,再由各个队列转发到消费者手中不是更加直接吗?
确实,信息不经过交换机流转的方式会更加直接,但是这种架构方式耦合度相对较高。在这种情况下,生产者和队列之前是强绑定状态,一旦生产者需要变动投递的队列,那么就必须要改动代码才可以实现更改。
而有了Exchange的加入,生产者则不需要关心消息会发送到哪个 Queue 或被哪些 Consumer 消费。在这种模式下生产者只面向 Exchange 发布消息,消费者只面向 Queue 消费消息,Exchange 定义了消息路由到 Queue 的规则,将各个层面的消息传递隔离开,使每一层只需要关心自己面向的下一层,降低了整体的耦合度。