RabbitMQ(一)
2022-09-22 22:46:19

目录:

[TOC]


RabbitMQ

1. MQ是什么

1.1 Message + Queue

在介绍RabbitMQ之前,先来说说什么是MQ

Message

消息:很简单就是我们的数据

Queue

队列:是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出(First in First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q=(a1,a2,…,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然在队伍的最后。

image20201130140514722.png

那么,假如队列里的元素不是a,而是消息。就可以称为是简单的消息队列了。

1.2 MQ的概念

MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据机构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。

  1. 首先得有个队列
  2. 生产者:产生消息并把消息放入队列
  3. 消费者:从队列里消费消息(拉取、订阅)

image20201130153656283.png

1.3 MQ的作用

消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。

解耦:一个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合。

异步:主业务执行结束后从属业务通过MQ,异步执行,减低业务的响应时间,提高用户体验。

削峰:高并发情况下,业务异步处理,提供高峰期业务处理能力,避免系统瘫痪。

1.4 MQ的缺点

1、系统可用性降低。依赖服务也多,服务越容易挂掉。需要考虑MQ瘫痪的情况

2、系统复杂性提高。需要考虑消息丢失、消息重复消费、消息传递的顺序性

3、业务一致性。主业务和从属业务一致性的处理

可以参考知乎的回答:https://www.zhihu.com/question/54152397

2. MQ有哪些

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。

2.1 使用场景

  1. Rabbit
    一般公司真实使用较多。结合Spring框架方便。
    综合性好。性能好,延时很低;吞吐量到万级,MQ功能比较完备,开源,管理界面不错,社区活跃
  2. Rocket
    阿里开源,性能好,支持事务(需要购买官方版),能承受高吞吐量
    对于分布式事务,一致性来说比Kafka好。一般有实力的公司选用。
  3. Kafka
    大数据、超高吞吐量就选它吧,极高的可用性以及可靠性,而且分布式可以任意扩展。适合数据收集,日志处理
    对于数据的重复、错误、丢失没有严格的要求
  4. ActiveMq
    老牌的MQ,有丰富的API,中小型企业受欢迎。但吞吐量不大,目前使用者不算太多。

2.2 对比区别

特性 ActiveMq RabbitMq RocketMQ Kafka
成熟度 成熟 成熟 比较成熟 成熟的日志领域
时效性 微秒级 毫秒级 毫秒级
社区活跃度
单机吞吐量 万级,吞吐量比RocketMQ和Kafka要低了一个数量级 万级,吞吐量比RocketMQ和Kafka要低了一个数量级 10万级,RocketMQ也是可以支撑高吞吐的一种MQ 10万级别,这是kafka最大的优点,就是吞吐量高。一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic数量对吞吐量的影响 topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic topic从几十个到几百个的时候,吞吐量会大幅度下降所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源
可用性 高,基于主从架构实现高可用性 高,基于主从架构实现高可用性 非常高,分布式架构 非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性 有较低的概率丢失数据 经过参数优化配置,可以做到0丢失 经过参数优化配置,消息可以做到0丢失
功能支持 MQ领域的功能极其完备 基于erlang开发,所以并发能力很强,性能极其好,延时很低 MQ功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准
优劣势总结 非常成熟,功能强大,在业内大量的公司以及项目中都有应用偶尔会有较低概率丢失消息而且现在社区以及国内应用都越来越少,官方社区现维护越来越少,几个月才发布一个版本而且确实主要是基于解耦和异步来用的,较少在大规模吞吐的场景中使用 rlang语言开发,性能极其好,延时很低;吞吐量到万级,MQ功能比较完备而且开源提供的管理界面非常棒,用起来很好用社区相对比较活跃,几乎每个月都发布几个版本分在国内一些互联网公司近几年用rabbitmq也比较多一些但是问题也是显而易见的,RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重。而且erlang开发,国内有几个公司有实力做erlang源码级别的研究和定制?如果说你没这个实力的话,确实偶尔会有一些问题,你很难去看懂源码,你公司对这个东西的掌控很弱,基本职能依赖于开源社区的快速维护和修复bug。而且rabbitmq集群动态扩展会很麻烦,不过这个我觉得还好。其实主要是erlang语言本身带来的问题。很难读源码,很难定制和掌控。 接口简单易用,而且毕竟在阿里大规模应用过,有阿里品牌保障日处理消息上百亿之多,可以做到大规模吞吐,性能也非常好,分布式扩展也很方便,社区维护还可以,可靠性和可用性都是ok的,还可以支撑大规模的topic数量,支持复杂MQ业务场景而且一个很大的优势在于,阿里出品都是java系的,我们可以自己阅读源码,定制自己公司的MQ,可以掌控社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准JMS规范走的有些系统要迁移需要修改大量代码还有就是阿里出台的技术,你得做好这个技术万一被抛弃,社区黄掉的风险,那如果你们公司有技术实力我觉得用RocketMQ挺好的 kafka的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展同时kafka最好是支撑较少的topic数量即可,保证其超高吞吐量而且kafka唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略这个特性天然适合大数据实时计算以及日志收集

3. AMQP协议

Rabbit是基于AMQP协议的

下图是AMQP的协议模型:

1538609201907201054359771170222541.png

正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。

生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。

接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。

4. Rabbit的安装

可以从官网下载,但一般比较缓慢(可以往下看,我分享了3.8.3版本的百度云链接)

1. 官网界面:点击Get Started

image20201130163532286.png

2. 点击DownLoad,然后进行选择

image20201130164031038.png

我是部署到了租的CentOs服务器上面,也就是说下面讲的是Linux的部署方式

4.1 安装Erlang

4.1.1 下载Erlang

RabbitMQ是Erlang语言编写,所以Erang环境必须要有

注:Erlang环境一定要与RabbitMQ版本匹配:https://www.rabbitmq.com/which-erlang.html

Erlang下载:

Erlang其他下载地址:

https://www.rabbitmq.com/releases/erlang/(根据自身需求及匹配关系,下载对应rpm包)

https://www.erlang.org/downloads

http://erlang.org/download/ 推荐

4.1.2 安装Erlang编译安装必要依赖

1
2
#没有换行是一句话,太长了
sudo yum install -y gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git

4.1.3 编译并安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.首先将刚刚下载的erlang的压缩包,上传到的你服务器

#2.利用cd命令,进入到压缩包的目录

#3.解压
tar -zxvf otp_src_22.3.tar.gz

#4. 进入otp_src_22.3目录
cd otp_src_22.3/

#5. 编译&安装 (执行下面的两个命令)
./otp_build autoconf

./configure && make && sudo make install

默认安装在/usr/local/lib/erlang/目录下

4.1.4 验证

1. 查看erl 版本erl -version

Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version xx.x

2. 执行erlerl

Erlang/OTP 22 [erts-10.7] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]

  1. Eshell V10.7 (abort with ^G)
  2. 1>

我是直接 Ctrl + C 退出 erl命令的

以上是Erlang的安装,还是有点hard的。接下来才到主角RabbitMq的安装(simpler)

我当时就差点被这个安装包和安装劝退了..要坚持下来

4.2 安装Rabbit

4.2.1 下载

  1. 百度云下载,再上传到服务器(推荐)

    再给个百度云链接,一步到胃 ^ _ ^

    rabbitmq-server-generic-unix-3.8.3.tar.xz

  2. 下面这个命令也可以直接获取rabbitmq-server(但一般下载很慢,或不能下载 。不推荐)

1
wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.8.3/rabbitmq-server-generic-unix-3.8.3.tar.xz
  1. 其他下载链接

    https://github.com/rabbitmq/rabbitmq-server/releases 推荐

    https://www.rabbitmq.com/install-rpm.html

    https://www.rabbitmq.com/releases/rabbitmq-server/

    https://dl.bintray.com/rabbitmq/all/rabbitmq-server/ 推荐

    rabbitmq-server-generic-unix-3.8.3.tar.xz

4.2.2 解压

1
2
3
4
5
6
7
8
9
10
#1. 将刚刚的压缩包上传到服务器
#2. 利用cd目录 进入压缩包的目录

#3. 解压 (执行下面两个命令)
xz -d rabbitmq-server-generic-unix-3.8.3.tar.xz

tar -xvf rabbitmq-server-generic-unix-3.8.3.tar

#4. 移动到 /usr/local/ 目录下
mv rabbitmq_server-3.8.3 /usr/local/

4.2.3 配置环境变量

1
2
3
4
5
6
#编辑配置文件
vim /etc/profile
# 在最后一行添加如下命令
export PATH=$PATH:/usr/local/lib/erlang/bin:/usr/local/rabbitmq_server-3.8.3/sbin
#使环境变量生效(source命令通常用于重新执行刚修改的初始化文件,使之立即生效)
source /etc/profile

附上一个图

image20201201094631802.png

4.3 启动MQ

报错 ERROR: node with name “rabbit” already running on “VM_0_2_centos”

如果启动不了 看一下进程里是否已启动

我自己是一次运行成功了,没有出错

1
2
3
4
#1. 开启管理界面的插件
rabbitmq-plugins enable rabbitmq_management
#2. 运行
rabbitmq-server 或 rabbitmq-server -detached(后台运行)

显示成这样就是成功啦^_^

image20201201100541313.png

4.3.1 添加新用户

  • 默认账号密码是(guest/guest),外网不能访问,但可以修改设置
  • 还可以添加新用户(外网可以访问)
1
2
3
4
5
6
7
#新添加账号:用户名:admin 密码:admin

#1. 添加命令
rabbitmqctl add_user admin admin(这里可以写你的密码)

#2. 设置管理员角色
rabbitmqctl set_user_tags admin administrator

4.3.2 访问后台

http://localhost:15672 或者 你的ip:15672

输入你的用户名密码

就进入了RabbitMq的控制界面,实际开发中一般用这个界面比较多。也可能使用命令行的方式。

image20201201101054756.png

4.3.3 其他操作

  1. 停止MQ
1
rabbitmqctl shutdown
  1. 解除guest账户的本地登录限制

    修改核心配置参数
    rabbitmq的核心配置参数在/usr/local/rabbitmq_server-3.8.3/ebin/rabbit.app里

1
2
3
vim /usr/local/rabbitmq_server-3.8.3/ebin/rabbit.app

# 找到loopback_users 修改为如下内容(去除 <<"guest">>中<<"">>) {loopback_users, [guest]},
  1. 命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#显示命令帮助
rabbitmqctl help
#插件命令帮助
rabbitmq-plugins
#插件
看插件打开情况:rabbitmq-plugins list

启动监控管理器:rabbitmq-plugins enable rabbitmq_management

关闭监控管理器:rabbitmq-plugins disable rabbitmq_management
#队列

查看所有的队列:rabbitmqctl list_queues

清除所有的队列:rabbitmqctl reset
#状态

查看状态:rabbitmqctl status

查看集群状态:rabbitmqctl cluster_status

集群同步:

所有节点的值相同:/var/lib/rabbitmq/.erlang.cookie

加入集群:

host1和host2,在host2上操作

先停止:rabbitmqctl -n rabbit stop_app

加入:rabbitmqctl -n rabbit join_cluster rabbit@$rabbit_hostname1

再启动:rabbitmqctl -n rabbit start_app

#用户管理

新增 rabbitmqctl add_user admin admin

删除 rabbitmqctl delete_user admin

修改 rabbitmqctl change_password admin admin123

用户列表 rabbitmqctl list_users

设置角色 rabbitmqctl set_user_tags admin administrator monitoring policymaker management

设置用户权限 rabbitmqctl set_permissions -p VHostPath admin ConfP WriteP ReadP

查询所有权限 rabbitmqctl list_permissions [-p VHostPath]

指定用户权限 rabbitmqctl list_user_permissions admin

清除用户权限 rabbitmqctl clear_permissions [-p VHostPath] admin

#多应用使用

rabbitmqctl -n rabbit_ceilometer 命令

安装部分参考自:我是Superman丶文章

5.管理界面初识

5.1 概览界面

img

5.2 交换机界面

img

5.3 Admin界面

5.3.1 用户授权

进入用户管理,我们之前添加的admin用户还没有权限。
点击Name一栏的admin,为其设置权限

image20201201112505595.png

一进来默认的信息已经填好了,直接点击Set permission 批准即可

image20201201130121379.pngQ.assets\image-20201201130121379.png)

5.3.2 创建虚拟主机

Admin -> Virtual Hosts -> Add a new virtual hosts

image20201201125843432.png

以上就是Rabbit的介绍好安装啦,下一篇来实战编码。

Prev
2022-09-22 22:46:19
Next