RabbitMQ 消息中间件详解以及Linux(RPM、yum)方式安装
1. 何为消息中间件?
先理解 消息 ,消息队列 这两个概念,才能更好的理解什么是 消息中间件。
- 消息(message)
指在服务之间传送的数据。可以是简单的文本消息,也可以使复杂包含嵌入对象的消息 - 消息队列(message queue)
指用来存放消息的队列,一般采用先见先出的队列方式 - 消息中间件
指管理消息队列的一个服务。
队列的一端接收生产者的消息,另一端去取出消息供消费者消费。
其中 消息生产者 只管把 消息 发送到 消息中间件,而不用管谁来取。消息消费者 只管从 消息中间件 取出消息,而不用管是谁发布的。这样将 生产者 和 消费者 解耦开来,彼此都不用知道对方的存在,降低了彼此的业务复杂性。
2. 消息中间件运用的场景
-
削峰
-
耗时长的业务
-
高并发的业务
-
解耦
3. 目前市面上所用到的消息中间件
- ActiveMQ
ActiveMQ是Apache出品,比较老的一个开源的消息中间件, 是一个完全支持JMS规范的消息中间件.
API丰富,以前在中小企业应用广泛
- KafKa
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。
这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。
这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。
对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。kafka
一开始是运用在大数据领域的日志相关的应用,后逐步完善。 缺点:可能会有信息丢失的情况。
- RocketMQ
RocketMQ 是阿里巴巴在 2012 年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于 2017 年 9 月
25 日成为 Apache
的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。
淘宝内部的交易系统使用了淘宝自主研发的 Notify 消息中间件,使用 MySQL
作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011 年初,Linkin开源了 Kafka
这个优秀的消息中间件,淘宝中间件团队在对 Kafka 做过充分 Review 之后, Kafka
无限消息堆积,高效的持久化速度吸引了我们,但是同时发现这个消息系统主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,为此我们重新用
Java 语言编写了 RocketMQ ,定位于非日志的可靠消息传输(日志场景也OK),目前 RocketMQ
在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理, binlog 分发等场景。
- RabbitMQ
abbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP :Advanced Message
Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
RabbitMQ
最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。一般用于对数据的一致性,稳定性和可靠性要求比较高的场景。
4. AMQP协议
4.1 AMQP协议模型
4.2 AMQP核心概念
- Server
又称作Broker,用于接受客户端的连接,实现AMQP实体服务;
Connection
连接,应用程序与Broker的网络连接;
- Channel
网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务;
- Message
消息,服务器和应用程序之间传送的数据,有Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则是消息体内容,即我们要传输的数据;
仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。
- Virtual Host
虚拟地址,是一个逻辑概念,用于进行逻辑隔离,是最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或者Queue;
Virtual Host是权限控制的最小粒度;
- Exchange
交换机,用于接收消息,可根据路由键将消息转发到绑定的队列;
- Binding
Exchange和Queue之间的虚拟连接,Exchange在与多个Message
Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding
Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing
Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding
Exchange与Message Queue时指定,而Routing
Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定
- Routing Key
一个路由规则,虚拟机可用它来确定如何路由一个特定的消息;
- Queue
也称作Message Queue,即消息队列,用于保存消息并将他们转发给消费者;
5. RabbitMQ整体架构图
6. RabbitMQ工作流程
7. RebbitMQ 安装方式
RPM 方式安装
官网地址:https://www.rabbitmq.com/
安装文档参考:https://www.rabbitmq.com/download.html
对于rabbitmq的安装方式有很多种, 我们这里使用通过rpm命令的方式进行安装, 因为rabbitmq是使用Erlang语言进行编写的,
所以我们在安装的时候需要先搭建Erlang的一个运行环境。
1. 下载并按安装Erlang
我们安装的rabbitmq的版本是3.7的,要求使用的Erlang版本必须是20.3.x的版本,我们可以去github下载对应的Erlang的对应版本https://github.com/rabbitmq/erlang-rpm/releases
上传到服务其中,执行命令
rpm -ivh erlang-22.0.4-1.el7.x86_64.rpm
2. 下载并安装rabbitmq-server
下载rabbitmq-server软件包
https://github.com/rabbitmq/rabbitmq-server/releases
yum -y install socat
rpm -ivh rabbitmq-server-3.7.23.rc.1-1.el7.noarch.rpm
3. 开启服务
添加rabbitmq-server开机启动
chkconfig rabbitmq-server on
启动服务:
service rabbitmq-server start
停止服务
service rabbitmq-server stop
开启管理页面的插件
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins 查看页面信息
rabbitmq-plugins list
4. 开启guest用户的远程访问
帮助文档:https://www.rabbitmq.com/access-control.html
配置rabbitmq.config
vi /etc/rabbitmq/rabbitmq.config
添加内容如下:
[{rabbit, [{loopback_users, []}]}].
配置完成以后,需要重新启动rabbitmq服务
若还没有解决则rabbitmq安装位置:
步骤1:/usr/share/doc/rabbitmq-server–版本号
步骤2: 找到文件 rabbitmq.config.example
步骤3:修改 vi rabbitmq.config.example(如图)
步骤4:重启rebbitmq
5. 创建用户,并赋予超级管理员权限
执行下面的命令创建一个用户
rabbitmqctl add_user 用户名 密码
执行下面的命令设置用户为超级管理员
rabbitmqctl set_user_tags 用户名 administrator
以上操作完成重启
service rabbitmq-server restart
用新账号登录即可.
6. 访问RabbitMQ 管理页面
http://{ip}:15672
7. 主要端口说明
4369 -- erlang发现口
5672 --client端通信口
15672 -- 管理界面ui端口
25672 -- server间内部通信口
举例说明 我们访问RabbitMQ管理界面可以访问如下: http://localhost:15672/
我们连接RabbitMQ的话就要用client端通信口: server:
amqp://guest:guest@localhost:5672/
yum 方式安装
官网地址:https://www.rabbitmq.com/
安装文档参考:https://www.rabbitmq.com/download.html
对于rabbitmq的安装方式有很多种, 我们这里使用通过yum命令的方式进行安装, 因为rabbitmq是使用Erlang语言进行编写的,
所以我们在安装的时候需要先搭建Erlang的一个运行环境
1. 通过yum仓库安装Erlang
我们安装的rabbitmq的版本是3.7的,要求使用的Erlang版本必须是20.3.x的版本,我们可以去github下载对应的Erlang的对应版本https://github.com/rabbitmq/erlang-rpm
vi /etc/yum.repos.d/rabbitmq-erlang.repo
Erlang 20.3.x
# In /etc/yum.repos.d/rabbitmq-erlang.repo
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/20/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
安装命令
yum install erlang -y
2. 通过yum命令安装rabbitmq-server
导入对应的验证签名:
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
创建一个rabbitmq的仓库文件:
vi /etc/yum.repos.d/rabbitmq.repo
添加如下信息
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/
gpgcheck=0
repo_gpgcheck=0
enabled=1
安装命令
yum install rabbitmq-server -y
3. 开启服务
添加rabbitmq-server开机启动
chkconfig rabbitmq-server on
启动服务:
service rabbitmq-server start
停止服务
service rabbitmq-server stop
开启管理页面的插件
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins 查看页面信息
rabbitmq-plugins list
- 开启guest用户的远程访问
配置rabbitmq.config
配置文件需要存放到/etc/rabbitmq/rabbitmq.config
[{rabbit, [{loopback_users, []}]}].
配置完成以后,需要重新启动rabbitmq服务。
⬇⬇⬇识别图中二维码关註⬇⬇⬇