RabbitMQ 学习
官方文档:RabbitMQ Tutorials — RabbitMQ
中文文档:Java客户端指南 · RabbitMQ in Chinese (mr-ping.com)
1、MQ 的分类
1.1、ActiveMQ
优点: 单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据。
缺点: 官方社区现在对 ActixeMQ 5.x 维护越来越少,高吞吐量场景较少使用。
1.2、Kafka
大数据的杀手锏,谈到大数据领域内的消息传输,则绕不开 Kafka,这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用。目前已经被LinkedIn、Uber、Twitter、Netflix 等大公司所采纳。
优点: 性能卓越,单机写入 TPS 约在百万条/秒,最大的优点,就是吞吐量高。时效性 ms 级可用性非常高,kafka 是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,消费者采用 Pull 方式获取消息,消息有序,通过控制能够保证所有消息被消费且仅被消费一次;有优秀的第三方 Kafka Web 管理界面 Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;功能支持:功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
缺点: Kafka 单机超过 64 个队列/分区,Load 会发生明显的飙高现象,队列越多,Load 越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢。
Kafka 主要特点是基于 Pull模式 来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。大型公司建议可以选用,如果有日志采集功能,肯定是首选 kafka 了。
1.3、RocketMQ
RocketMQ 出自阿里巴巴的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。被阿里巴巴广泛应用在订单、交易、充值、流计算、消息推送、日志流式处理、binglog 分发等场景。
优点: 单机吞吐量十万级,可用性非常高,分布式架构,消息可以做到 0丢失,MQ 功能较为完善,还是分布式的,扩展性好,支持10亿级别的消息堆积,不会因为堆积导致性能下降,源码是 java 我们可以自己阅读源码,定制自己公司的 MQ。
缺点: 支持的客户端语言不多,目前是 java 及 c++,其中 c++ 不成熟;社区活跃度一般,没有在 MQ 核心中去实现 JMS 等接口,有些系统要迁移需要修改大量代码。
天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。RoketMQ 在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择RocketMQ
1.4、RabbitMQ
2007年发布,是一个在 AMQP(高级消息队列协议) 基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
优点: 由于 erlang
语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备、健壮、稳定、易用、跨平台、支持多种语言如: Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AAX文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高。
缺点: 商业版需要收费,学习成本较高
结合 erlang
语言本身的并发优势,性能好时效性微秒级,社区活跃度也比较高,管理界面用起来十分方便,如果你的数据量没有那么大,中小型公司优先选择功能比较完备的 RabbitMQ。
2、RabbitMQ
2.1、概念
RabbitMQ 是一套开源(MPL)的消息队列服务软件,是由 LShift
提供的一个 高级消息队列协议(Advanced Message Queuing Protocol,AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
RabbitMQ 拥有数以万计的用户,是最受欢迎的开源消息中间件之一。从 T-Mobile 到 Runtastic,RabbitMQ 在全球范围内用于小型初创企业和大型企业。
RabbitMQ 是轻量级的,易于在本地和云中部署。它支持多种消息传递协议。
RabbitMQ 可以部署在分布式和联合配置中,以满足高规模、高可用性的需求。
RabbitMQ 在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发人员工具。
2.2、核心部分
2.3、名词解释
工作原理图:
- Connection(连接)
Connection 是一个 TCP 长连接。
- Broker
接收和分发消息的应用,RabbitMQ Server就是 Message Broker
- Virtual host(虚拟主机)
Virtual host 是一个虚拟主机的概念,一个 Broker 中可以有多个 Virtual host,每个 Virtual host 都有一套自己的 Exchange 和 Queue,同一个 Virtual host 中的 Exchange 和 Queue 不能重名,不同的 Virtual host 中的 Exchange 和 Queue 名字可以一样。这样,不同的用户在访问同一个 RabbitMQ Broker 时,可以创建自己单独的 Virtual host,然后在自己的 Virtual host 中创建 Exchange 和 Queue,很好地做到了不同用户之间相互隔离的效果。
- Queue(队列)
Queue 是一个用来存放消息的队列,生产者发送的消息会被放到 Queue 中,消费者消费消息时也是从 Queue 中取走消息。
- Channel(信道)
Channel 是在 Connection 的基础上建立的虚拟连接,RabbitMQ 中大部分的操作都是使用 Channel 完成的,比如:声明Queue、声明Exchange、发布消息、消费消息等。
现在的程序都是支持多线程的,如果没有Channel,那么每个线程在访问 RabbitMQ 时都要建立一个 Connection 这样的 TCP 连接,对于操作系统来说,建立和销毁 TCP 连接是非常大的开销,在系统访问流量高峰时,会严重影响系统性能。Channel 就是为了解决这种问题,通常情况下,每个线程创建单独的Channel进行通讯,每个 Channel 都有自己的 channel id
帮助 Broker 和客户端识别 Channel ,所以 Channel 之间是完全隔离的。
- Exchange(交换机)
message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 Queue 中去。
常用的类型有: direct (point-to-point)、topic(publish-subscribe) 、 fanout(multicast)、headers。
Routing key(路由键),当我们创建好 Exchange 和 Queue 之后,需要使用 Routing key(通常叫作 Binding key)将它们绑定起来,producer 在向Exchange 发送一条消息的时候,必须指定一个 Routing key,然后 Exchange 接收到这条消息之后,会解析 Routing key,然后根据 Exchange 和 Queue 的绑定规则,将消息分发到符合规则的 Queue 中。
3、RabbitMQ 的安装
Downloading and Installing RabbitMQ — RabbitMQ
3.1、Docker 方式安装
需要先安装 Docker : Linux CentOS 7 环境安装_稻草人0.0的博客-CSDN博客_centos7安装包
# latest RabbitMQ 3.10
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management
3.2、下载安装包方式安装
1)查看系统版本
el7
: CenOS 7 版本的系统。
[root@localhost ~]$ cat /proc/version
Linux version 3.10.0-1160.71.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Jun 28 15:37:28 UTC 2022
2)下载 socat
在 RabbitMQ
安装过程中需要依赖 socat
插件,首先安装该插件:
# 下载地址
http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
# wget 下载
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
# yum 安装
sudo yum install -y socat
3)下载 RabbitMQ
RabbitMQ
的下载地址:rabbitmq/rabbitmq-server - Packages · packagecloud | Releases · rabbitmq/rabbitmq-server · GitHub
# 下载地址
https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm
# wget 下载
wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm
# yum 安装
sudo yum install rabbitmq-server-3.10.0-1.el7.noarch
4)下载 Erlang
RabbitMQ 是采用 Erlang 语言开发的,系统环境必须提供 Erlang 环境,所以需要安装 Erlang。
Erlang
和 RabbitMQ
版本对照:RabbitMQ Erlang Version Requirements — RabbitMQ
Erlang下载地址:rabbitmq/erlang - Packages · packagecloud
# 其中的el7表示 Red Hat 7.x, 即 CentOS 7.x
# 下载安装包地址
https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.rpm
# wget 下载
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.rpm
# yum 安装
sudo yum install erlang-23.3.4.11-1.el7.x86_64
5)rpm 安装步骤
创建软件存放目录,并上传下载的软件:
$ mkdir -p /usr/local/rabbitmq
[root@localhost rabbitmq]$ ll
总用量 34552
-rw-r--r--. 1 root root 20355564 7月 27 23:20 erlang-23.3.4.11-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 14733987 7月 27 23:20 rabbitmq-server-3.10.0-1.el7.noarch.rpm
-rw-r--r--. 1 root root 284676 7月 27 23:20 socat-1.7.3.2-5.el7.lux.x86_64.rpm
开始安装:
# 安装 socat (加解密软件)插件
$ rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
# 安装 erlang 语言环境
$ rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm
# 最后安装 rabbitMQ
$ rpm -ivh rabbitmq-server-3.10.0-1.el7.noarch.rpm
6)启动 RabbitMQ 服务
# 启动 rabbitMQ
$ systemctl start rabbitmq-server
# 查看 rabbitMQ 状态
$ systemctl status rabbitmq-server
# 设置 rabbitMQ 服务开机自启动
$ systemctl enable rabbitmq-server
# 关闭 rabbitMQ 服务
$ systemctl stop rabbitmq-server
# 重启 rabbitMQ 服务
$ systemctl restart rabbitmq-server
7)RabbitMQ Web 可视化管理界面
# 打开 RabbitMQ Web 管理界面插件
$ rabbitmq-plugins enable rabbitmq_management
开启防火墙的 15672
端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --add-port=15672/tcp
firewall-cmd --reload
# 查看开启了哪些端口
firewall-cmd --list-ports
浏览器打开地址: http://虚拟机的IP:15672/
RabbitMQ 有一个默认的账号密码 guest
,但该情况仅限于本机 localhost 进行访问,所以需要添加一个远程登录的用户。
8)添加远程用户
# 添加用户
$ rabbitmqctl add_user [用户名] [密码]
# 设置用户角色,分配操作权限
$ rabbitmqctl set_user_tags [用户名] [角色]
# 为用户添加资源权限(授予访问虚拟机根节点的所有权限)
$ rabbitmqctl set_permissions [-p <vhostpath>] <usr> <conf> <write> <read>
$ rabbitmqctl set_permissions -p / [用户名] ".*" ".*" ".*"
# 修改密码
$ rabbitmqctl change_ password [用户名] [新密码]
# 删除用户
$ rabbitmqctl delete_user [用户名]
# 查看用户清单
$ rabbitmqctl list_users
角色有四种:
- administrator:可以登录控制台、查看所有信息、并对 RabbitMQ 进行管理
- monToring:监控者;登录控制台,查看所有信息
- policymaker:策略制定者;登录控制台指定策略
- managment:普通管理员;登录控制
测试
[root@localhost rabbitmq]$ rabbitmqctl add_user mianbao admin
Adding user "mianbao" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
[root@localhost rabbitmq]$ rabbitmqctl set_user_tags mianbao administrator
Setting tags for user "mianbao" to [administrator] ...
[root@localhost rabbitmq]$ rabbitmqctl set_permissions -p / mianbao ".*" ".*" ".*"
Setting permissions for user "mianbao" in vhost "/" ...