RabbitMQ 学习(一)-- 概念和安装

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-MobileRuntastic,RabbitMQ 在全球范围内用于小型初创企业和大型企业。

RabbitMQ 是轻量级的,易于在本地和云中部署。它支持多种消息传递协议。

RabbitMQ 可以部署在分布式和联合配置中,以满足高规模、高可用性的需求。

RabbitMQ 在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发人员工具

2.2、核心部分

在这里插入图片描述
在这里插入图片描述

2.3、名词解释

RabbitMQ的工作模式及原理 (baidu.com)

工作原理图:

在这里插入图片描述

  • 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。

ErlangRabbitMQ 版本对照: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 727 23:20 erlang-23.3.4.11-1.el7.x86_64.rpm
-rw-r--r--. 1 root root 14733987 727 23:20 rabbitmq-server-3.10.0-1.el7.noarch.rpm
-rw-r--r--. 1 root root   284676 727 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 "/" ...

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值