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

news2024/12/24 10:00:31

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.coloradmin.cn/o/676145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Neurophotonics | HyperOptoNet:用于fNIRS超扫描脑间神经同步分析的MATLAB工具箱

导读 意义:本研究开发了一个基于MATLAB的工具箱,用于脑间同步(IBS)分析,并进行了实验研究以验证其性能。据所知,这是第一个基于功能近红外光谱(fNIRS)超扫描数据的IBS工具箱,可在两个三维(3D)头部模型上直观地显示结果…

Elasticsearch:analyzer

前奏 es的chinese、english、standard等分词器对中文分词十分不友好,几乎都是逐字分词,对英文分词比较友好。 在kibana的dev tools中测试分词: POST /_analyze {"analyzer": "standard","text": "你太…

用OpenCV进行透视变换

1. 引言 欢迎回来!今天我们将焦点聚焦在我在图像处理中最喜欢的话题之一——透视变换。使用该技术,可以灵活方便的实现各种各样好玩的特效。 闲话少说,我们直接开始吧! 2. 单应矩阵 我们首先展开对单应矩阵的深入研究。作为图…

车载-惯性导航系统

概念 惯性导航系统是一种不受电磁波干扰,且不依靠外界信号即可完成自主定位的导航系统。 惯性导航系统的主要定位测量装置由加速度传感器和陀螺仪组成。其中,加速度传感器是用来测量载体所受到的惯性力,并通过牛顿第二加速度定律获取被测载…

OpenGL 面剔除

1.简介 OpenGL能够检查所有面向观察者的面,并渲染它们,而丢弃那些背向的面,节省我们很多的片段着色器调用(它们的开销很大!)。但我们仍要告诉OpenGL哪些面是正向面,哪些面是背向面。OpenGL使用…

Axure教程——走马灯

本文介绍用Axure中的动态面板制作走马灯效果 一、效果 预览地址:https://okjxsd.axshare.com 二、功能 1、图片自动播放并显示其状态 2、点击左右箭头,图片播放并显示其状态 三、制作 1、动态面板制作 拖进一个动态面板元件,设置尺寸&#…

RISC-V semi-hosting原理以及实践

嵌入式裸机调试需要在有限资源的目标硬件上尽可能挖掘更多的信息,比如打印寄存器等等,但是即便看似很简单的串口打印,在有的情况下也是奢望,针对这种情况,能够有效利用主机资源协同调试的semi-host(半主机&…

B. Fish Graph(dfs找环)

Problem - 1817B - Codeforces 给定一个具有n个节点和m条边的简单无向图。请注意,该图不一定是连通的。节点从1到n标记。 如果图包含具有特殊节点u的简单循环,则定义图为Fish Graph。除循环中的边之外,图应恰好有2条额外的边。两条边都应连接…

设计模式之外观模式笔记

设计模式之外观模式笔记 说明Facade(外观)目录外观模式示例类图电灯类电视机类空调类智能音箱外观类测试类 说明 记录下学习设计模式-外观模式的写法。JDK使用版本为1.8版本。 Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高…

【2023,学点儿新Java-23】初步了解Java中的修饰符:static及其作用、native特性、final的理解

前情回顾: 【2023,学点儿新Java-22】Java中package的作用是什么 | Java中import的用法 | Java中的权限修饰符:private、protected、public【2023,学点儿新Java-21】Java中default的语法格式 | 父类私有的方法能被重写吗&#xff…

三分钟学习一个python小知识3-----------我的对python的列表和元组的理解

我的目录 1、python是什么2、列表的应用3. 元组的应用:4、深层次地进一步理解列表和元组4.1. 列表示例:4.2. 元组示例: 总结 1、python是什么 在Python中,列表和元组都是用于存储多个数据项的数据结构,但是它们有一些…

JavaWeb Tomcat

1.Web分类 静态web html这样的静态网页,只展示预先设定好的内容每个用户看到的内容是一样的不连接数据库,无法持久化数据(比如注册)动态web 动态展示内容每个用户看到的内容是不一样的,比如会有个性化推荐连接数据库&…

TienChin 项目改造完善项目结构分析

项目改造完善 更改 Banner Banner 生成网站:https://bootschool.net/ascii 更改启动类中的 Banner !> 如果不生效,需要重新编译一下项目工程(出现了启动之后还没改变就需要执行一下这个步骤): 出现的原因是可能你没有删除 .idea 文件与 .i…

夜不收见证:夫妻从内江到成都,从真诚到真相

他们从四川内江的一条小巷,走进了成都的大街小巷。那里的房屋挨挨挤挤,像是在讲述他们曾经的梦想和勇气。他们是那些在内江的土地上种下了友情种子的少年,他们在成都的大地上,硕果累累。 他们从初中的课桌前走到了成人的世界里&am…

模拟电路系列文章-滤波器常识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 滤波是一个动作,对不同频率输入信号,实施不同的增益和相移,以形成输出。滤波器,是执行这种动作的硬件设备或者软件程序。无论滤…

DJ4-7 SDN、OpenFlow

目录 一、SDN 1、SDN 的引入 2、SDN 体系结构的特征 3、SDN 控制器 4、SDN 通用转发 二、OpenFlow 一、SDN 1、SDN 的引入 软件定义网络 (Software Defined Network) SDN 源自美国斯坦福大学 Clean Slate 研究组提出的一种新型网络创新架构,可通过软件编程…

OCC-BEV:基于三维场景重建的多摄像机统一预训练

论文:https://arxiv.org/pdf/2305.18829.pdf 代码:https://github.com/chaytonmin/Occ-BEV 多摄像机3D感知技术(能够收集车辆周围360的环境信息)已经成为自动驾驶领域的一个突出研究领域,为 Lidarb-based 解决方案提供…

EMC学习笔记(九)特殊信号的EMC处理(一)

特殊信号的EMC处理(一) 1.电源接口EMC防护滤波电路1.1 24VDC电源口1.2 电源地的EMC电路1.3 Flyback EMC电路1.4 BUCK电路EMC电路1.5 推挽电路 2.时钟电路的EMC防护2.1 有源时钟2.2 无源时钟2.3 差分时钟 3.复位电路EMC防护4.对外接口信号的EMC防护4.1 差…

简历不要随意给猎头!他们会胡乱投递,影响你之后求职!

猎头是求职的重要途径之一,但猎头群体良莠不齐,并不是每个猎头都值得信任。 一位网友就对猎头持怀疑态度,问大家: 简历可以随意给猎头吗?给他们的时候需要注意什么?他们会不会群发,对自己之后求…

软考A计划-系统集成项目管理工程师-一般补充知识-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…