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

RabbitMQ应用场景和集群搭建

  • 1. MQ的应用场景
    • 1.1 异步处理
    • 1.2 应用解耦
    • 1.3 流量削峰
  • 2、RabbitMQ集群搭建
    • 2.1 普通集群(副本集群)
      • 2.1.1 架构图
      • 2.1.2 集群搭建
        • 1、集群规划:这里用三台虚拟机测试
        • 2、克隆三台机器主机名和ip映射
        • 3、 在其他两台节点上安装`rabbitmq`
        • 4、后台启动rabbitmq所有节点执行如下命令,启动成功访问管理界面:
        • 5、在node2和node3执行加入集群命令:
        • 6、查看集群状态,任意节点执行:
        • 7、测试在node1上添加交换机
        • 8、测试在node1上添加队列
    • 2.2 镜像队列
      • 2.2.1 架构图
      • 2.2.2 配置
        • (1)添加策略(在任意一台节点上执行)
        • (2)生产者测试发一条消息
        • (3)将主节点node1宕机
        • (4)查看从节点状态
        • (5)此时测试消息是否能被消费

1. MQ的应用场景

1.1 异步处理

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

  • 串行方式: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.

image-20230621175922474

  • 并行方式: 将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。

image-20230621175933927

  • 消息队列:假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并行已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回. 消息队列: 引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理

    image-20230621175941599

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


1.2 应用解耦

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

image-20230621175948534

这种做法有一个缺点:

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

image-20230621180005150

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。

  • 库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失.


1.3 流量削峰

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

作用:

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

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

image-20230621180028911

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

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


2、RabbitMQ集群搭建

2.1 普通集群(副本集群)

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

2.1.1 架构图

image-20230621180330794

2.1.2 集群搭建

1、集群规划:这里用三台虚拟机测试

192.168.159.111 mq1
192.168.159.39 mq2
192.168.159.40 mq3

2、克隆三台机器主机名和ip映射

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

vim /etc/hosts

添加如下配置:

192.168.159.111 mq1
192.168.159.39 mq2
192.168.159.40 mq3

三台节点分别修改主机名

node1: vim /etc/hostname 加入:  mq1
node2: vim /etc/hostname 加入:  mq2
node3: vim /etc/hostname 加入:  mq3

3、 在其他两台节点上安装rabbitmq

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

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

image-20230621202253963

(2).安装Erlang依赖包

rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm

(3).安装rabbitmq

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).复制配置文件

cp /usr/share/doc/rabbitmq-server3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

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

ls /etc/rabbitmq/rabbitmq.config

image-20230621202739416

(6).修改配置文件

vim /etc/rabbitmq/rabbitmq.config 

image-20230621202926129

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

image-20230621202821739

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

rabbitmq-plugins enable rabbitmq_management

常用命令:

systemctl start rabbitmq-server
systemctl restart rabbitmq-server
systemctl stop rabbitmq-server

4、后台启动rabbitmq所有节点执行如下命令,启动成功访问管理界面:

rabbitmq-server -detached 

image-20230621203224845

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

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

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

rabbitmqctl stop_app

image-20230621203423547

image-20230621203440956

(2)将node2和node3加入集群

rabbitmqctl join_cluster rabbit@mq1

image-20230621203525960

image-20230621203539875

(3)启动服务

启动mq2和mq3

rabbitmqctl start_app

6、查看集群状态,任意节点执行:

rabbitmqctl cluster_status

image-20230621203723003

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

image-20230621203809825

image-20230621203825175

image-20230621203836474

7、测试在node1上添加交换机

image-20230621203956821

image-20230621204012005

查看node2和node3结点是否同步

image-20230621204033907

image-20230621204045471

8、测试在node1上添加队列

image-20230621204333982

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

2.2 镜像队列

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

2.2.1 架构图

image-20230621205758828

2.2.2 配置

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

image-20230621212715823

(1)添加策略(在任意一台节点上执行)

rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}'

image-20230621213158873

image-20230621212816740

(2)生产者测试发一条消息

image-20230621214153050

(3)将主节点node1宕机

image-20230621214248566

image-20230621214302154

(4)查看从节点状态

node2:

image-20230621214356615

image-20230621214411316

node3:

image-20230621214441281

image-20230621214448463

(5)此时测试消息是否能被消费

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

image-20230621214658023

image-20230621214731078

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

队列中的消息也没有了。

(6)此时恢复node1

image-20230621214816529

image-20230621215117879

image-20230621214829261

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

(6)删除策略

rabbitmqctl clear_policy ha-all

image-20230621214955170

image-20230621215006343

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型实战(13)之YOLOv8实现手语字母检测与识别+权重分享

YOLOv8实现手语字母检测与识别+权重分享 本文借助yolov8 实现手语字母的检测与识别:先检测手的ROI,进而对手语表达的字母含义进行识别全文将从环境搭建、模型训练及预测来展开对整个算法流程进行讲解文中给出了开源数据集链接及从 Roboflow 上的下载教程实现效果如下: 1. 环…

目标检测基础

MTCNN 人脸检测 MTCNN,Multi-task convolutional neural network(多任务卷积神经网络),将人脸区域检测与人脸关键点检测放在了一起,它的主题框架类似于cascade。总体可分为P-Net、R-Net、和O-Net三层网络结构。这三个…

如何用ChatGPT使开发效率提高50%以上?

简介 ChatGPT是一个大型语言模型,由OpenAI开发。它被训练用于进行对话式交互,能够理解和生成自然语言文本。ChatGPT可以用于多种任务和场景,包括但不限于:智能助手、创意生成、语言学习、编程辅助等。ChatGPT的优势在于它的广泛知…

【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C语言:打印用 * 组成的X形图案

题目: 多组输入一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。 思路: 总体思路: 实际打印的是 n*n 的图案, 只不过是当 行等于列(正斜线) 、行列行数-1(反…

io.netty学习(十一)Reactor 模型

目录 前言 传统服务的设计模型 NIO 分发模型 Reactor 模型 1、Reactor 处理请求的流程 2、Reactor 三种角色 单Reactor 单线程模型 1、消息处理流程 2、缺点 单Reactor 多线程模型 1、消息处理流程 2、缺点 主从Reactor 多线程模型 主从Reactor 多线程模型示例 1…

Web自动化元素定位之xpath定位详解

Web自动化常见的定位方式 为什么要学习定位 1.让程序操作指定元素,就必须先找到此元素 2.程序不像人类用眼睛直接定位到元素 webDriver提供了八种定位元素的方式 定位方式总结 1.id、name、class_name、tag_name:根据元素的标签或元素的属性来进行定位 2.link_t…

flask搭建在线音乐网系统

1.使用虚拟环境Virtualenv来创建项目 2. Flask框架介绍 Flask框架是一个用Python编写的轻量级Web应用程序框架,依赖于Werkzeug和Jinja2两个外部库。Werkzeug是一个WSGI工具包,用于接收和处理HTTP请求,匹配视图函数,支持Cookie和会…

Linux :LNMP(源码包安装)

Linux 虚拟机 VMware:安装centos7_鲍海超-GNUBHCkalitarro的博客-CSDN博客 物理机 linux:真机安装centos linux(突发事件:解决卡在安装界面){寻找镜像--u启制作--引导u盘--解决卡在安装界面--安装配置}_安装centos7卡…

边缘计算开源平台

边缘计算 文章目录 边缘计算前言01 边缘计算开源平台概述02 面向物联网端的边缘计算开源平台2.1 EdgeXFoundry2.2 ApacheEdgent 03 面向边缘云的边缘计算开源平台3.1 CORD3.2 Akraino EdgeStack 04 面向云边融合的边缘计算开源平台05 构建边缘计算平台的开源软件06 结束语 前言…

PSD笔记

在实际应用中,一个信号我们不可能获得无穷长时间段内的点,对于数字信号,只能通过采样的方式获得N个离散的点。上文提到,实际信号基本上是随机信号,由于不可能对所有点进行考察,我们也就不可能获得其精确的功…

mybatis-plus在实际开发中的应用

文章目录 前言一、实体类的注解二、Req查询条件三、Controller接口四、Service接口五、Service接口实现类六、Mapper接口七、枚举的使用总结 前言 最近的项目是使用mybatis-plus作为持久层框架,前面也记录过mybatis-plus的基本使用,此次记录一下本次项目…