快速入门高级消息中间件RabbitMQ
快速入门高级消息中间件RabbitMQ
1 消息中间件简介
消息队列( Message Queue )是 种进程间或者线程间的异步通信方式,使用消息队列,消息
生产者在产生消息后,会将消息保存在消息队列中,直到消息消费者来取走它 ,即 消息的发送者和
接收者不需要同时与消息队列交互 使用消息队列可以有效实现服务的解耦,并提高系统的可靠性
以及可扩展性。目前,开源的消息队列服务非常多,如 Apache ActiveMQ、RabbitMQ、RocketMQ和Kafka
等,这些产 品也就是常说的消息中间件
1.1 JMS
简介
JMS (Java Message Service )
即 Java 消息服务,它通过统JAVA API
层面的标准,使得多
客户端可以通过 JMS
行交互 ,大部分消息中 间件提供商都对JMS
提供支持 JMS ActiveMQ
的关系就像JDBC
和JDBC
驱动的关系。JMS
包括两种消息模型:点对点和发布者/订阅者,同时
JMS
仅支持 Java 平台。
1.2 AMQP简介
AMQP (Advanced Message Queuing Protocol ,高级消息队列协议)
是 个线路层的协议规范,
而不是 API
规范(例如 JMS
)。由于AMQP
是一个线路层协议规范,因此它天然就是跨平台的,
就像 SMTP HTTP 等协议 样,只要开发者按照规范的格式发送数据,任何平台都可以通过 AMQP
进行消息交互。像目前流行的 StormMQ、RabbitMQ
等都实现了 AMQP
1.3AMQP
协议中的基本概念
-
Broker
:接收和分发消息的应用,我们在介绍消息中间件的时候所说的消息系统就是Message Broker -
Virtual host
: 出于多租户和安全因素设计的,把AMQP
的基本组件划分到一个虚拟的分组中,类似于网络中 的namespace
概念。当多个不同的用户使用同一个RabbitMQ server
提供的服务时,可以划分出多个vhost
, 每个用户在自己的vhost
创建exchange/queue
等 -
Connection
:publisher/consumer
和broker之间的TCP
连接。断开连接的操作只会在client端进行,Broker 不会断开连接,除非出现网络故障或broker服务出现问题 -
Channel
: 如果每一次访问RabbitMQ
都建立一个Connection,在消息量大的时候建立TCP Connection
的开 销将是巨大的,效率也较低。Channel
是在connection
内部建立的逻辑连接,如果应用程序支持多线程,通 常每个thread
创建单独的channel
进行通讯,AMQP method
包含了channel id
帮助客户端和message broker
识别channel
,所以channel
之间是完全隔离的。Channel
作为轻量级的Connection极大减少了操作系统建立TCP connection
的开销。 -
Exchange
:message到达broker
的第一站,根据分发规则,匹配查询表中的routing key
,分发消息到queue
中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
。 -
Queue
: 消息最终被送到这里等待consumer取走,一个message可以被同时拷贝到多个queue中。 -
Binding
: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到 exchange中的查询表中,用于message的分发依据。 -
Producer
:消息生产者,主要将消息投递到对应的 Exchange 上面; -
Consumer
:消息消费者,消息的接收者,一般是独立的程序;
Exchange的类型
-
direct
: 只有绑定时的routing_key
与发送消息的routing_key
完全匹配时,消息才会被交换器投送到绑定的队列中去; -
fanout
: 转发消息到所有绑定队列; -
topic
: 按规则转发消息,topic
他可以根据:星,#( 星号代表过滤一单词,#代 表过滤后面所有单词, 用.隔开)来识别routingKey
。打个比方假设我绑定的routingKey
有队列A和B ,A的routingKey
是:*.user,B的routingKey
是:#.user
;那么我生产一条消息routingKey
为:error.user
那么此时 2个队列都能接受到, 如果改为topic.error.user
那么这时候 只有B能接受到了 -
headers
: 设置 Header Attribute 参数类型的交换机;这个类型的交换机很少用到,他的路由规则与routingKey
无关,而是通过判断header参数来识别的, 基本上没有应用场景,因为上面的三种类型已经能应付了。
1.4 消息中间件的应用场景
消息中间件主要用于典型的异步处理、应用解耦、流量削峰和消息通讯等四个场景,
典型的应用如电商系统中使用消息中间件处理下订单和查库存
消息中间件处理订单: 用户下订单->订单系统给消息中间件发送订单信息->
消息系统异步查询库存系统->异步返回库存信息给订单系统:
如果这张图能理解的话, 那么 上面的消息系统, 就是消息中间件。
2 RabbitMQ
介绍
MQ: message Queue
顾名思义 消息队列, 队列大家都知道, 存放内容的一个东西, 存放的内容先进先出, 消 息队列, 只是里面存放的内容是消息而已。
RabbitMq
是一个开源的 基于AMQP
协议实现的一个完整的企业级消息中间件,服务端语言由Erlang(面向并发编 程)语言编写 ,对于高并发的处理有着天然的优势,客户端支持非常多的语言,如Python、Java、Ruby、PHP、C#、JavaScript、GO、Objective-C和Swift等
主流MQ
之间的对比
特性 | ActiveMQ |
RabbitMQ |
RocketMQ |
Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,比RocketMq和Kafaka 低一个数量级 |
同ActiveMQ
|
10万级,支持高吞吐 | 十万级,高吞吐,一般配合大数据类系统来进行实时数据计算、日志采集等场景 |
topic数量对吞吐量的影响 | topic可以达到几百/几千的级别、吞吐量会有较小幅度的下降,这是RocketMq 的一大优势,同等机器下可以支撑大量的topic |
topic从几十到几百的时候,吞吐量会大幅度下降,在同等机器下,kafka 尽量保证topic数量不要过多;如果要支撑大规模的topic,需要增加机器资源 |
||
时效性 | 毫秒级 | 微妙级,这是RabbitMq 的一大特点,延迟最低 |
毫秒级 | 毫秒级 |
可用性 | 高,基于主从架构实现高可用 | 同ActiveMQ
|
非常高、分布式架构 | 非常高,分布式,一个数据多个副本,少数机器宕机不会导致数据丢失,也不会导致不可用 |
消息可靠性 | 有较低的概率丢失数据 | 经过参数优化配置可以做到零丢失 | 同RocketMQ
|
|
功能支持 | MQ领域功能及其完备 | 基于Erlang语言开发,并发能力很强、性能极好、延迟很低 |
MQ 功能较为完善,还是分布式的,扩展性好 |
功能较为简单,主要支持简单的MQ 功能,在大数据领域的实时计算以及日志采集中被规模使用 |
3 下载和安装RabbitMQ
服务端
最新的RabbitMQ
是3.8.5版本,可至官方网站下载:https://www.rabbitmq.com/
3.1 Windows系统下安装
在安装RabbitMQ
之前需要先安装ERlang
语言环境(官方下载特别慢,读者可至这个链接通过百度云盘下载:https://pan.baidu.com/s/1pZJ8l2f3omrgnuCm9a8DVA)
笔者本机windows系统上安装的是rabbitmq-server-3.7.9版本
安装的话, 基本上就是默认的选项不用改
如何看RabbitMq
安装完成了? 在系统-服务中找到如下即可:
包括启动 停止 重启 服务等
使用管理工具添加用户并配置权限
到你们安装的 RabbitMQ Server\rabbitmq_server-3.7.12\sbin
目录下面 执行一条cmd
命令:
rabbitmq-plugins enable rabbitmq_management
直接复制这条命令即可 , 当然 嫌每次都要去目录中去执行的麻烦的话, 可以配置一个环境变量 或者在我们的开
始菜单栏中找到这个:
输入完启动命令后 稍微等一下会有结果返回 然后可以打开浏览器 输入:
http://127.0.0.1:15672
默认账号密码都是
guest 即 username :guest
password:guest
登录进去之后会看到如下界面:
注意: 管理工具和rabbitmq
是两码事 ,所以端口也就不一样
这个页面在笔记里面介绍起来可能比较复杂, 就不一一介绍了, 我这里讲个重点, 就是线上环境下一定要吧
guest用户(当然 guest这个用户只能本机才能登陆)删掉并且新加一个用户, 这里就演示一下这个功能
首先 点击admin
页签, 在下面找到Add User
然后输入账号 密码 确认密码 这个Tags其实是一个用户权限标签, 关于他的介绍可以看官方介绍(点旁边那个小问
号就好了,我这里直接翻译他的介绍)
Comma-separated list of tags to apply to the user. Currently supported by the management plugin:
以逗号分隔的标签列表,应用于用户。目前由管理插件支持
management
管理
User can access the management plugin
用户可以管理插件
policymaker
政策制定者
User can access the management plugin and manage policies and parameters for the vhosts they have access to.
用户可以访问管理插件并管理他们有权访问的vhosts的策略和参数
monitoring
监控
User can access the management plugin and see all connections and channels as well as node-related information.
用户可以访问插件以及连接和通道以及与节点有关的信息
administrator
管理员
User can do everything monitoring can do, manage users, vhosts and permissions, close other user's connections, and manage policies and parameters for all vhosts.
用户可以执行任何监控可以做的事情,管理用户、虚拟主机和权限,关闭其他用户的连接以及管理所有虚拟主机的策略和参数
Note that you can set any tag here; the links for the above four tags are just for convenience.
注意:你可以在此处设置任何标记,以上四个标签的链接只是为了方便
首先添加admin
用户,密码:admnin123
填写完之后点击AddUser 就可以添加一个用户了, 添加完用户之后还要给这个用户添加对应的权限(注:Targ不
等于权限)
这里 我们给了他/这个Virtual host的权限 ,正则匹配都是* 也就是所有权限
然后点击Set permission
添加完毕
3.2 Linux系统下安装 RabbitMQ
这里在常用的CentOS 7
系统下安装RabbitMQ
CentOS 7
系统中安装Erlang 21.2
3.2.1 添加Erlang 源
由于 RabbitMQ
使用 Erlang 编写,因此需要先安装 Erlang 环境 CentOS
中安装 Erlang 21.0
的步骤如下:
- 使用
XShell6
客户端登录CentOS 7
执行如下命令
执行 命令新建 software目录:mkdir /usr/local/software
,
并执行cd /usr/local/software
命令切换到software
目录下;
2)在XShell6
上使用新建文件传输将otp_src_21.2.tar
压缩包上传到/usr/local/software
目录下
使用微信扫描下方二维码关注作者的微信公众号后发送消息【erlang】获取压缩包下载百度网盘地址和提取码
对应安装rabbitmq3.7.12版本
- 解压和编译
#解压
tar -zxvf otp_src_21.2.tar `
cd otp_src_21.2
#编译
. /otp build autoconf
./configure
#编译过程称出现报错
configure: error: No curses library functions found
#提示 ,需要首先安装 ncurses-devel
yum install ncurses-devel
#重新编译
./configure
#编译过程中出现如下错误信息(先忽略)
odbc : ODBC library - link check failed
wx : wxWidgets not found, wx will NOT be usable
#安装,先后执行下面两个命令
make
make install
#检验
erl
最后一步是检验,如果看到下图所示的效果图,表示安装成功。
- 将最新的 Erlang 包添加到 yum 源中
vim /etc/yum.repos.d/rabbitmq-erlang.repo
,按住i键
后进入编辑模式,在文件中添加如下内容
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/22/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
添加完后,按住esc键后再按住shift+:
输入wq!
后回车保存
- 清除原有缓存并创建新缓存
yum clean all
yum makecache
3.2.2 安装RabbitMQ
- 将下载的安装包
rabbitmq-server-3.7.12-1.el7.noarch.rpm
使用新建文件传输上传到/usr/local/software
目录下
扫描下方二维码,关注作者的微信公众号后发送消息【rabbitmq-server】获取压缩包下载百度网盘地址和提取码
2) 上传到/usr/local/software
目录后开始在software
目录下开始安装
yum install rabbitmq-server-3.7.12-1.el7.noarch.rpm
安装过程中涉及到程序自动询问安装erlang.x86_64
和socat
,一律输入y
回车确认下载安装
yum install erlang.x86_64
yum install socat
3)安装成功后,接下来就可以启动 RabbitMQ
井进行用户管理了,命令如下
#启动
service rabbitmq-server start
#查看状态
rabbitmqctl status
#开启web插件
rabbitmq-plugins enable rabbitmq_management
#重启
service rabbitmq-server restart
#添加一个用户名为admin,登录密码为admin123的用户
rabbitmqctl add_user admin admin123
#设置admin 用户的角色为管理员
rabbitmqctl set_user_tags admin administrator
#配置admin用户可远程登录
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
4)通过rabbitmqctl -?
或者rabbitmqctl help --list-commands
可以查看到 rabbitmqctl
下几乎所有的指令。
- 对
rabbitmq
相关端口开通防火墙
#开通rabbitmq管理界面15672端口
firewall-cmd --permanent --zone=public --add-port=15672/tcp
#开通rabbitmq服务5672端口
firewall-cmd --permanent --zone=public --add-port=5672/tcp
#重启防火墙服务
systemctl restart firewalld.service
- 如果Linux系统使用的是腾讯云或者阿里云,还需要前往登录腾讯云控制台在安全组中添加入站规则
- 在浏览器中输入:
http://134.175.187.61:15672/
地址就可以访问rabbitmq-management
的首页了
- 输入用户名
admin和密码admin123
登录成功就可以访问rabbitmq-management
的管理界面
4 小结
1)高级消息队列协议(AMQP
)的包含的重要概念:Broker、vhost、Connection、Channel、Exchange、Queue、Binding、Producer和Consumer
,Exchange
主要有四种类型:Direct、Fanout、Topic和headers
,而topic
类型的Exchange
按照一定的路由规则转发消息在应用中使用得最多;
2)rabbitmq
具有基于Erlang语言开发,并发能力很强、性能极好、延迟很低,客户端支持Python、Java、GO
等大那部分编程语言等一系列优势;
3)rabbitmq
服务端的安装需要先安装Erlang语言环境,然后再安装rabbitmq
服务端程序,windows环境下安装比较简单,
Linux环境下安装较为复杂。在文章重点演示了Linux环境下安装erlang-21.2语言环境
和rabbitmq-server-3.7.12
程序,以及Linux环境下防火墙开放与rabbitmq
相关的端口
4)下一篇文章笔者会详细演示rabbitmq
消息中间件在spring-boot
项目中的应用,敬请期待!
参考资料
[1] 王松著《Spring Boot+Vue全栈开发实战
》第12章消息服务;
[2] 鲁班学院《RabbitMq第一节
》课程讲义;
[3] Rabbitmq安装过程和踩过的坑( 一 安装 );
[4] Requires: erlang >= 20.3 Available: erlang-R16B-03.18.el7.x86_64
欢迎读者朋友们扫描下面的二维码,关注作者的微信公众号,与作者一起学习成长,向着java架构师的方向前进!
本文地址:https://blog.csdn.net/heshengfu1211/article/details/107420045
推荐阅读
-
Spring Boot 入门之消息中间件的使用
-
深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议
-
Spring Boot2.X整合消息中间件RabbitMQ原理简浅探析
-
RabbitMQ的简单模式快速入门与超时异常的处理方法
-
消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!
-
快速入门高级消息中间件RabbitMQ
-
SpringCloud项目从消息中间件中获取到消息(SpringCloud整合Netty和RabbitMQ以及WebSocket)
-
EasyNetQ操作RabbitMQ(高级消息队列)
-
rabbitMQ消息中间件环境配置及原理了解
-
【RabbitMQ消息中间件】4.简单队列