前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ应用场景和集群搭建复习

RabbitMQ应用场景和集群搭建复习

作者头像
别团等shy哥发育
发布2023-10-17 14:19:15
1680
发布2023-10-17 14:19:15
举报
RabbitMQ应用场景和集群搭建

1. MQ的应用场景

1.1 异步处理

场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式

  • 串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.
image-20230621175922474
image-20230621175922474
  • 并行方式: 将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。
image-20230621175933927
image-20230621175933927
  • 消息队列:假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并行已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回. 消息队列: 引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理
image-20230621175941599
image-20230621175941599

由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。


1.2 应用解耦

场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.

image-20230621175948534
image-20230621175948534

这种做法有一个缺点:

当库存系统出现故障时,订单就会失败。 订单系统和库存系统高耦合. 引入消息队列

image-20230621180005150
image-20230621180005150
  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
  • 库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失.

1.3 流量削峰

场景: 秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。

作用:

​ 1.可以控制活动人数,超过此一定阀值的订单直接丢弃(我为什么秒杀一次都没有成功过呢^^)

​ 2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)

image-20230621180028911
image-20230621180028911

1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.

2.秒杀业务根据消息队列中的请求信息,再做后续处理。


2、RabbitMQ集群搭建

2.1 普通集群(副本集群)

默认情况下:RabbitMQ代理操作所需的所有数据/状态都将跨所有节点复制。这方面的一个例外是消息队列,默认情况下,消息队列位于一个节点上,尽管它们可以从所有节点看到和访问

2.1.1 架构图
image-20230621180330794
image-20230621180330794
2.1.2 集群搭建
1、集群规划:这里用三台虚拟机测试
代码语言:javascript
复制
192.168.159.111 mq1
192.168.159.39 mq2
192.168.159.40 mq3
2、克隆三台机器主机名和ip映射

在三台机器中追加如下操作:

代码语言:javascript
复制
vim /etc/hosts

添加如下配置:

代码语言:javascript
复制
192.168.159.111 mq1
192.168.159.39 mq2
192.168.159.40 mq3

三台节点分别修改主机名

代码语言:javascript
复制
node1: vim /etc/hostname 加入:  mq1
node2: vim /etc/hostname 加入:  mq2
node3: vim /etc/hostname 加入:  mq3
3、 在其他两台节点上安装rabbitmq

这个就大概说一下,网上教程太多了

(1).将rabbitmq安装包上传到linux系统中

image-20230621202253963
image-20230621202253963

(2).安装Erlang依赖包

代码语言:javascript
复制
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm

(3).安装rabbitmq

代码语言:javascript
复制
rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm

注意:默认安装完成后配置文件模板在:/usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example目录中,需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq.config

(4).复制配置文件

代码语言:javascript
复制
cp /usr/share/doc/rabbitmq-server3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

(5).查看配置文件位置

代码语言:javascript
复制
ls /etc/rabbitmq/rabbitmq.config
image-20230621202739416
image-20230621202739416

(6).修改配置文件

代码语言:javascript
复制
vim /etc/rabbitmq/rabbitmq.config 
image-20230621202926129
image-20230621202926129

将上图中配置文件中%%去掉,以及最后的,逗号 修改为下图:

image-20230621202821739
image-20230621202821739

(7).启动rabbitmq中的插件管理

代码语言:javascript
复制
rabbitmq-plugins enable rabbitmq_management

常用命令:

代码语言:javascript
复制
systemctl start rabbitmq-server
systemctl restart rabbitmq-server
systemctl stop rabbitmq-server
4、后台启动rabbitmq所有节点执行如下命令,启动成功访问管理界面:
代码语言:javascript
复制
rabbitmq-server -detached 
image-20230621203224845
image-20230621203224845

警告是因为没有PID文件的写入权限,先不用管。

5、在node2和node3执行加入集群命令:

(1)先将node2和node3节点关闭,

代码语言:javascript
复制
rabbitmqctl stop_app
image-20230621203423547
image-20230621203423547
image-20230621203440956
image-20230621203440956

(2)将node2和node3加入集群

代码语言:javascript
复制
rabbitmqctl join_cluster rabbit@mq1
image-20230621203525960
image-20230621203525960
image-20230621203539875
image-20230621203539875

(3)启动服务

启动mq2和mq3

代码语言:javascript
复制
rabbitmqctl start_app
6、查看集群状态,任意节点执行:
代码语言:javascript
复制
rabbitmqctl cluster_status
image-20230621203723003
image-20230621203723003

此时集群已经搭建成功,登录管理界面查看:

image-20230621203809825
image-20230621203809825
image-20230621203825175
image-20230621203825175
image-20230621203836474
image-20230621203836474
7、测试在node1上添加交换机
image-20230621203956821
image-20230621203956821
image-20230621204012005
image-20230621204012005

查看node2和node3结点是否同步

image-20230621204033907
image-20230621204033907
image-20230621204045471
image-20230621204045471
8、测试在node1上添加队列
image-20230621204333982
image-20230621204333982

此时node2和node3结点也可以看到该队列,但是一旦主节点宕机,node2和node3是不能对外提供服务的。

2.2 镜像队列

镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升MQ集群的整体高可用性。

2.2.1 架构图
image-20230621205758828
image-20230621205758828
2.2.2 配置

刚开始的时候只有个持久化,没有其他策略

image-20230621212715823
image-20230621212715823
(1)添加策略(在任意一台节点上执行)
代码语言:javascript
复制
rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
image-20230621213158873
image-20230621213158873
image-20230621212816740
image-20230621212816740
(2)生产者测试发一条消息
image-20230621214153050
image-20230621214153050
(3)将主节点node1宕机
image-20230621214248566
image-20230621214248566
image-20230621214302154
image-20230621214302154
(4)查看从节点状态

node2:

image-20230621214356615
image-20230621214356615
image-20230621214411316
image-20230621214411316

node3:

image-20230621214441281
image-20230621214441281
image-20230621214448463
image-20230621214448463
(5)此时测试消息是否能被消费

直接去连接从节点,假设连接node2

image-20230621214658023
image-20230621214658023
image-20230621214731078
image-20230621214731078

可以看到,从节点的消息是能否被消费掉的

队列中的消息也没有了。

(6)此时恢复node1

image-20230621214816529
image-20230621214816529
image-20230621215117879
image-20230621215117879
image-20230621214829261
image-20230621214829261

可以看到,此时node2变成了主节点

(6)删除策略

代码语言:javascript
复制
rabbitmqctl clear_policy ha-all
image-20230621214955170
image-20230621214955170
image-20230621215006343
image-20230621215006343

队列也不再是镜像队列了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RabbitMQ应用场景和集群搭建
  • 1. MQ的应用场景
    • 1.1 异步处理
      • 1.2 应用解耦
        • 1.3 流量削峰
        • 2、RabbitMQ集群搭建
          • 2.1 普通集群(副本集群)
            • 2.1.1 架构图
            • 2.1.2 集群搭建
          • 2.2 镜像队列
            • 2.2.1 架构图
            • 2.2.2 配置
        相关产品与服务
        消息队列
        腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档