Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >RabbitMQ应用场景和集群搭建复习

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

作者头像
别团等shy哥发育
发布于 2023-10-17 06:19:15
发布于 2023-10-17 06:19:15
21700
代码可运行
举报
运行总次数:0
代码可运行
RabbitMQ应用场景和集群搭建

1. MQ的应用场景

1.1 异步处理

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

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

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


1.2 应用解耦

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

这种做法有一个缺点:

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

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

1.3 流量削峰

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

作用:

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

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

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

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


2、RabbitMQ集群搭建

2.1 普通集群(副本集群)

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/hosts

添加如下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
192.168.159.111 mq1
192.168.159.39 mq2
192.168.159.40 mq3

三台节点分别修改主机名

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

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

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

(2).安装Erlang依赖包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm

(3).安装rabbitmq

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
cp /usr/share/doc/rabbitmq-server3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ls /etc/rabbitmq/rabbitmq.config

(6).修改配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/rabbitmq/rabbitmq.config 

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitmq-plugins enable rabbitmq_management

常用命令:

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitmqctl stop_app

(2)将node2和node3加入集群

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitmqctl join_cluster rabbit@mq1

(3)启动服务

启动mq2和mq3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitmqctl start_app
6、查看集群状态,任意节点执行:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitmqctl cluster_status

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

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

查看node2和node3结点是否同步

8、测试在node1上添加队列

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

2.2 镜像队列

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

2.2.1 架构图
2.2.2 配置

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

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

node2:

node3:

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

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

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

队列中的消息也没有了。

(6)此时恢复node1

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

(6)删除策略

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitmqctl clear_policy ha-all

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
7430
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
利用 Redis 实现分布式锁
对于这个问题,我们可以简单将锁分为两种——内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关键字(或许加上进程级锁修饰更恰当些),而分布式锁则是应用在分布式系统中的一种锁机制。分布式锁的应用场景举例以下几种:
烂猪皮
2020/11/25
6290
利用 Redis 实现分布式锁
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
首先,先来看它的概念-控制分布式系统之间同步访问共享资源的一种方式。所以,它需要满足以下四个特性:互斥性、可重入性、锁超时防死锁、锁释放正确防误删。而01篇中提到的JVM锁在分布式场景中就会存在问题,比如,我们当前有两个服务实例,它们都访问商品库存表进行扣减库存,如果使用JVM锁,其实并没有效果,如图:
别惹CC
2025/02/19
2220
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
Redis分布式锁实战
我们学习 Java 都知道锁的概念,例如基于 JVM 实现的同步锁 synchronized,以及 jdk 提供的一套代码级别的锁机制 lock,我们在并发编程中会经常用这两种锁去保证代码在多线程环境下运行的正确性。但是这些锁机制在分布式场景下是不适用的,原因是在分布式业务场景下,我们的代码都是跑在不同的JVM甚至是不同的机器上,synchronized 和 lock 只能在同一个 JVM 环境下起作用。所以这时候就需要用到分布式锁了。
编程大道
2020/07/15
6420
Redis分布式锁实战
[Redis] 分布式缓存中间件 Redis 之 分布式锁实战
环境准备Redis 如何实现分布式锁线程不安全单机锁分布式锁代码实现Redisson 集成和源码分析Redisson 集成源码分析 `RedissonLock`加锁解锁集群分布式锁失效判断机制总结REFERENCES更多
架构探险之道
2020/03/19
8270
[Redis] 分布式缓存中间件 Redis 之 分布式锁实战
基于redis实现分布式锁思考
synchronized虽然能够解决同步问题,但是每次只有一个线程访问,并且synchronized锁属于JVM锁,仅适用于单点部署;然而分布式需要部署多台实例,属于不同的JVM线程对象
沁溪源
2020/12/28
8950
基于redis实现分布式锁思考
Redis进阶-细说分布式锁
Redis进阶-核心数据结构进阶实战 中我们讲 strings 数据结构的时候,举了一个例子
小小工匠
2021/08/17
4510
Redis高并发分布式锁详解
  1.为了解决Java共享内存模型带来的线程安全问题,我们可以通过加锁来保证资源访问的单一,如JVM内置锁synchronized,类级别的锁ReentrantLock。
忧愁的chafry
2022/10/30
1.1K0
Redis高并发分布式锁详解
分布式锁:5个案例,附源码
常见的synchronized、Lock等这些锁都是基于单个JVM的实现的,如果分布式场景下怎么办呢?这时候分布式锁就出现了。
田维常
2021/11/26
4840
基于redis的分布式锁
两个微服务,synchronized关键字只能锁住一个微服务,跨微服务是锁不住的。
CBeann
2023/12/25
1970
基于redis的分布式锁
蚂蚁金服面试:如何优雅的用Redis实现分布式锁?
上述代码可以看到,当前锁的失效时间为10s,如果当前扣减库存的业务逻辑执行需要15s时,高并发时会出现问题:
Java程序猿
2021/02/25
5900
手撸一把分布式锁
使用Java提供的synchronized关键字简简单单的就为我们的奖品兑换程序添加了一把锁,同步的只有一个线程可以对我们的数据库进行减库存的操作,安全的不行,但是姜同学突然想到这个奖品兑换的服务是部署在两台服务器的是分布式的,因为synchronized是基于JAVA虚拟机的进程锁,当我们的系统变为分布式以后如果还是使用这种方式可是要出问题的哦。
姜同学
2022/10/27
2050
分布式锁-redis实现
为什么要分布式锁 在单机的情况下,可以通过jvm提供的系列线程安全的操作来处理高并发的情况,但是在分布式的环境下,jvm提供的线程安全操作明显是不能满足要求的。在一些小型的互联网公司经常做的crud操作如果在高并发的情况下会出现很大的问题,比如: //伪代码:下订单 1、查库存:getStock() 2、判断库存:stock>0下单 3、下单:addOrder() 4、减库存 仅仅以上三步,如果在高并发的情况下,无论是单机或者集群,如果不加锁一定会出现超卖的情况。一瞬间成千上万个请求过来,如何能够确保查询
爱撒谎的男孩
2020/03/09
5730
Redis 分布式锁
一般电商网站都会遇到秒杀、特价之类的活动,大促活动有一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?分布式锁就是一个解决方案。
张云飞Vir
2022/09/29
4640
【分布式进阶】我们来填填Redis分布式锁中的那些坑。
  大家好,我是Coder哥,最近在准备面试鸽了一段时间,面试告一段落了,今天我们来聊一下基于Redis锁中的那些坑。这篇分析比较全面,记得点赞收藏哟!!!
TodoCoder
2022/09/23
6340
【分布式进阶】我们来填填Redis分布式锁中的那些坑。
java架构之路-(Redis专题)简单聊聊redis分布式锁
  这次我们来简单说说分布式锁,我记得过去我也过一篇JMM的内存一致性算法,就是说拿到锁的可以继续操作,没拿到的自旋等待。
小菜的不能再菜
2019/10/29
3770
java架构之路-(Redis专题)简单聊聊redis分布式锁
【Redis】SpringBoot集成Redis分布式锁以及Redis缓存
第二个spring-boot-start-cache的依赖,是使用缓存注解需要的,我在项目中没有引入。 因为我在websocket中已经引入了。 查询依赖关系 ctrl+shift+alt+u 快捷键(也可以在pom.xml文件上右键->Maven->Show Dependencies…)查询maven包依赖引入关系,ctrl+f搜索包
谙忆
2021/01/21
9360
SpringBootredis使用setnx完成分布式锁
使用springboot自动配置好的StringRedisTemplate来操作redis
暴躁的程序猿
2022/07/12
8410
浅谈分布式锁实现原理
现在有个问题,就是如果我按上面这样写,如果我们中途程序执行的时候抛出了一个异常,那么我们的锁就永远得不到释放,下一个线程过来,发现锁没释放,就导致整个系统卡死
阿超
2022/08/16
2570
【第十二篇】商城系统-分布式锁的应用
setNX: setNX(key,value) :如果key不存在那么就添加key的值,否则添加失败,Redisson
用户4919348
2022/10/04
2300
【第十二篇】商城系统-分布式锁的应用
相关推荐
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验