MQ消息中间件常见题及解决办法

news2024/11/25 18:27:25

目录儿

  • 常见MQ
  • RocketMQ
    • 2、`RocketMQ`测试可用
  • MQ常见问题
    • 1、幂等性问题
    • 2、如何保证消息不丢失
    • 3、消息积压问题
    • 4、事务消息设计分析

常见MQ

在这里插入图片描述
在这里插入图片描述

RocketMQ

RocketMQ又四部分组成

  • NameServer 同步Broker服务信息,给消费者和生产者提供可用Broker的服务信息。
  • Broker 消息存储业务核心
  • Producer 消息生产者
  • Consumer 消息消费者

先启动NameServer作为注册中心,然后再启动Broker服务。

2、RocketMQ测试可用

RocketMQ的安装包中,提供了一个tools.sh工具可以用来在命令行快速验证RocketMQ服务。进入RocketMQ的安装目录:
① 首先需要配置一个环境变量NAMESRV_ADDR指向我们启动的NameServer服务。

export NAMESRV_ADDR='localhost:9876'

② 然后执行工具脚本,启动消息生产者发送消息:默认会发1000条消息

bin/tools.sh org.apache.rocketmg.example.quickstart.Producer

③ 然后执行工具脚本,然后启动消息消费者接收消息

bin/tools.sh org.apache.rocketmg.example.quickstart.Consumer

成功了表单机服务就搭建好了

MQ常见问题

1、幂等性问题

通常。客户端调用服务端接口是通过http协议来调取的,不安全且整个调用过程是一个同步过程。服务端处理业务逻辑比较耗时没有及时响应的情况下,于服务端而言产生了请求堆积,可能会造成 服务雪崩。于客户端会造成阻塞等待、超时断开 自动重试,这样服务器端接口就在一段时间内接收到了n个相同的请求,产生了 幂等性问题

如何防止幂等性问题,通用做法:

  • 如表单重复提交、add表数据,可以用全局id做唯一约束
  • 如重复update表数据,可以用版本号防止重复修改,每次修改都基于版本号

在这里插入图片描述

  1. 幂等性:
    所谓的幂等性,是分布式环境下的一个常见问题,一般是指我们在进行多次操作时,所得到的结果是一样的,即多次运算结果是一致的(同一个业务逻辑重复执行多次最终只算一次)。
    也就是说,用户对于同一操作,无论是发起一次请求还是多次请求,最终的执行结果是一致的,不会因为多次点击而产生副作用。
  2. 常见幂等性操作:
    • select查询天然幂等;
    • delete删除也是幂等,删除同一个数据多次其效果一样;
    • update直接更新某个值时,幂等;
    • update更新累加操作的的结果,非幂等;
    • insert操作会每次都新增一条,非幂等;
  3. 什么情况下会产生重复提交(非幂等性):
    • 连续点击提交两次按钮;
    • 点击刷新按钮;
    • 使用浏览器后退按钮重复之前的操作,导致重复提交表单;
    • 使用浏览器历史记录重复提交表单;
    • 浏览器重复地HTTP请求等。

2、如何保证消息不丢失

在这里插入图片描述
引入MQ消息中间件最直接的目的是:做系统解耦合流量控制,追其根源还是为了解决互联网系统的高可用和高性能问题
在这里插入图片描述
引入MQ虽然实现了系统解耦合流量控制,也会带来其他问题
在这里插入图片描述
其中保证数据传输的一致性就是保证消息不丢失的关键

消息从生产到消费不同环节发生消息丢失对应的原因不同,解决方案也不同,所以要分开来说
在这里插入图片描述
在这里插入图片描述
上面三个环节的解决方案看似完美,但在分布式系统中,常常出现各种故障,且不可避免,所以还是需要一种机制,来检查消息是否丢失

总体方案思路:
在消息生产端,给每个发出的消息都指定一个全局唯一D或者附加一个连续递增的版本号,然后在消费端做对应的版本校验

具体实现思路1:
可以利用拦截器机制,在生产端发送消息之前,通过拦截器将消息版本号注入消息中,然后在消费端收到消息后,再通过拦截器检测版本号的连续性或消费状态,这样实现的好处是消息检测的代码不会侵入到业务代码中,可以通过单独的任务来定位丢失的消息,做进一步的排查
在这里插入图片描述
不同的唯一ID生成方案也会有不同的问题存在,没有完美的方案。
在这里插入图片描述

3、消息积压问题

如果出现积压,那一定是性能问题,想要解决消息从生产到消费上的性能问题就首先要知道哪些环节可能出现消息积压,然后在考虑如何解决。

因为消息在生产并发送到Broker之后才会出现积压问题,所以问题不在生产端,而又因为在绝大部分消息队列单节点性能都能达到几万/s的处理能力,所以问题大概率也不在存储端上。所以性能问题绝大多数出现在消费端。

应急处理方案:
如果是线上突发问题,就要临时扩容,增加消费端的数量(水平扩容),与此同时,还可以降级一些非核心的业务,通过扩容和降级抗住流量。

扩容的同时要增加分区,防止扩容失效。

逻辑优化方案:
排查解决异常问题,比如通过查看监控,日志等手段分析是否消费端的业务逻辑代码出现了问题,进而优化消费端的业务处理逻辑,提升消费能力。

4、事务消息设计分析

如下场景:用户操作下单,我们首先需要生成一条订单信息,然后库存系统需要针对订单中的商品进行库存扣减的操作。这两步操作必须保证数据的一致性,否则会出现库存超扣等情况。

第一种情况如图所示,在本地事务提交前发送事务消息。若在创建订单信息时发生了异常,而此时事务消息已经成功发送,库存系统消费事务消息就会导致订单并没有创建成功,而库存却被扣减。
在这里插入图片描述
进而有了第二种情况,如图所示,在本地事务提交完成后再发送事务消息。若在发送事务消息的过程发生了异常,如网络波动等等,将会出现订单已创建完成,而库存系统永远也监听不到消息,导致库存无法正常扣减。
在这里插入图片描述综合第一和第二种情况,汇总成第三种方案如图所示。在本地事务执行前,先向MQ发送前置的Prepared消息,在本地事务执行完毕后,再发送确认的消息,告知MQ当前事务消息需提交/回滚。如果事务正常则提交消息,那么这条消息将会被消息消费方监听到;如果事务回滚,MQ会丢弃这条消息,消息消费方无法监听到这条消息。以上情况对应 事务消息生产者的设计思路 图中的 1、2、3、4步骤。
在这里插入图片描述
继续分析,如果上图的第二步中,发送确认消息的过程中,出现异常,没有发送成功怎么办?RocketMQ会定期(默认60s)扫描Prepared消息,如果迟迟没有收到确认消息,将会执行事务回查的逻辑,主动去消息生产方确认事务状态。对应 事务消息生产者的设计思路 图中的 5、6、7步骤。综上,是事务消息中生产者的设计思路,保证本地事务和事务消息一致性。
在这里插入图片描述
如上图中,在事务消息者中,如果步骤4返回了消费失败或者超时未响应的情况,怎么办?RocketMQ对待事务消息的处理和普通消息一样。如果消费失败或超时,将会把这条消息加入到重试队列中,不断是重复执行步骤3、4,如果重复的次数达到阈值,那么可能需要人工介入处理。

如果消费方本地事务执行成功,仅仅是在确认消息时失败呢? 那么这里又会出现另一个问题 重复消费? 这里就需要具体的业务模块去处理消息的幂等性。如接住Redis来处理。如在本地事务执行前先去查询redis中当前消息是否已经消费,执行成功后再向redis写入一条成功消费的记录,这样就能保证消费不会被重复消费了。

参考资料:

  1. 哔哩哔哩 余胜军 BAT大厂消息中间件MQ,常见面试题及答案,你能搞懂有哪些?
    https://www.bilibili.com/video/BV1zK4y1e7kS?share_source=copy_web
  2. 如何解决幂等性问题? - Java马剑威的回答 - 知乎
    https://www.zhihu.com/question/534651475/answer/2542377973
  3. 哔哩哔哩 so贝塔 MQ:如何回答消息队列的丢失、重复与积压问题
    https://www.bilibili.com/video/BV1F8411g7LF?share_source=copy_web
  4. 哔哩哔哩 图灵教育-诸葛 这可能是B站讲的最好的RocketMQ实战教程全套完整版(2023年最新版)
    https://www.bilibili.com/video/BV1DY41127Be?p=2&share_source=copy_web
    5.CSDN Rooibos gron RocketMQ事务消息
    https://blog.csdn.net/qq_42877546/article/details/125404307

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

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

相关文章

Python-第二天 Python基础语法

Python-第二天 Python基础语法一、 字面量1.1 常用的值类型1.1.1 字符串(string)二、注释2.1 注释的作用2.2 注释的分类三、变量3.1 什么是变量3.2 变量的特征四、数据类型4.1 数据类型4.2 type()语句4.3 type()语句的使用方式4.4 变量有类型吗&#xff…

【电商】后台订单生成

结合商品流转的电商系列介绍了一些了,商品已经采购入库、价格税率设置好了、活动及相关模板也已经准备完毕,下面就应该上架销售了,现在接着聊下订单的生成。 订单从产生到最终的关闭需要经历很多的环节,订单也是电商系统的核心数据…

Springcloud Alibaba 及各微服务组件整合梳理

Spring Cloud Alibaba 微服务各组件整合项目: 版本说明&#xff1a; <spring-boot.version>2.6.3</spring-boot.version><spring-cloud.version>2021.0.1</spring-cloud.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-a…

抖音的外卖行业入局,为中小外卖企业创业者的机会给了哪些机会?

一则关于抖音进入外卖市场的消息&#xff0c;让美团“非常受伤”。 2月8日&#xff0c;美团(03690.HK&#xff09;盘中跌幅超9%。截至收盘&#xff0c;美团报收153.1港元&#xff0c;跌幅6.48%。美团大幅下跌的根源就是前一天关于抖音外卖进展的消息传闻。 2月7日&#xff0c…

一站式 Elasticsearch 集群指标监控与运维管控平台

上篇文章写了一下消息运维管理平台&#xff0c;今天带来的是ES的监控和运维平台。目前初创企业&#xff0c;不像大型互联网公司&#xff0c;可以重复的造轮子。前期还是快速迭代试错阶段&#xff0c;方便拿到市场反馈&#xff0c;及时调整自己的战略和产品方向。让自己活下去&a…

大数据入门怎么学习

大数据学习不能停留在理论的层面上&#xff0c;大数据方向切入应是全方位的&#xff0c;基础语言的学习只是很小的一个方面&#xff0c;编程落实到最后到编程思想。学习前一定要对大数据有一个整体的认识。 大数据是数据量多吗&#xff1f;其实并不是&#xff0c;通过Hadoop其…

chatGPT 官网使用详细教程 (亲测可行)

文章目录1. chatGPT 介绍2. 进入官网3. 开始使用1. chatGPT 介绍 chatGPT 是一款由 OpenAI 开发的聊天机器人模型&#xff0c;它能够模拟人类的语言行为&#xff0c;与用户进行自然的交互。它的名称来源于它所使用的技术—— GPT-3架构&#xff0c;即生成式语言模型的第3代…

三极管-晶体管开关速度有两种方法

晶体管开关速度有两种方法可以考虑一下 1、使用加速电容 在基极限流电阻并联小容量的电容&#xff08;一般pF级别&#xff09;&#xff0c;当输入信号上升、下降时候能够使限流电阻瞬间被旁路并提供基极电流&#xff0c;所以在晶体管由导通状态变化到截止状态时能够迅速从基极…

【强训】Day13

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 参数解析2. ★跳石板答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 一个关系数据库文件中的各条记录 &#xff08;&#xff09; A 前后顺序不能任意颠倒&#xff0c;一定要按照…

C语言typedef的用法详解

C语言允许为一个数据类型起一个新的别名&#xff0c;就像给人起“绰号”一样。起别名的目的不是为了提高程序运行效率&#xff0c;而是为了编码方便。例如有一个结构体的名字是 stu&#xff0c;要想定义一个结构体变量就得这样写&#xff1a;struct stu stu1;struct 看起来就是…

图解项目延期的原因及解决应对方案大全

项目管理中经常出现项目延期的情况&#xff0c;面对项目延期的风险如何应对是考验每个项目经理管理水平的时候&#xff0c;很多人纵然是工作多年也没有对延期的种种情况进行总结思考。咱们社区的小竹对大家常见的项目延期情况及处理方案进行了详细全面的总结&#xff0c;供大家…

微服务 分片 运维管理

微服务 分片 运维管理分片分片的概念分片案例环境搭建案例改造成任务分片Dataflow类型调度代码示例运维管理事件追踪运维平台搭建步骤使用步骤分片 分片的概念 当只有一台机器的情况下&#xff0c;给定时任务分片四个&#xff0c;在机器A启动四个线程&#xff0c;分别处理四个…

Python类型-语句-函数

文章目录类型动态类型:变量类型会随着程序的运行发生改变注释控制台控制台输入input()运算符算术关系逻辑赋值总结语句判断语句while循环for循环函数链式调用和嵌套调用递归关键字传参在C/java中&#xff0c;整数除以整数结果还是整数&#xff0c;并不会将小数部分舍弃&#xf…

线上CPU飙高诊断定位

1. 先准备一段java程序&#xff0c;后台运行 2. 使用 top命令查看cpu的进程使用情况 在这里看到了一个进程占据了99.3%的cpu利用率&#xff0c;这显然是出现了cpu飙升的情况&#xff0c;这会到期系统其他进程得不到cpu的使用权&#xff0c;从而出现卡顿&#xff0c;因此需要进行…

第五章——大数定律和中心极限定理

文章目录1、大数定律1.1、弱大数定理&#xff08;辛钦大数定理&#xff09;1.2、伯努利大数定理2、中心极限定理2.1、独立同分布的中心极限定理2.2、李雅普诺夫定理2.3、棣莫弗——拉普拉斯定理2.4、中心极限定理的应用2.4.1、独立同分布的中心极限定理的应用2.4.2、棣莫弗——…

文件同步是什么?解析6个最佳的文件同步应用软件

文件同步应用程序是一项服务或程序&#xff0c;它提供了一种便捷的方式来在多台计算机或移动设备上自动文件同步。在登录文件同步应用程序的任何地方&#xff0c;都可以使用相同的文件来打开&#xff0c;编辑&#xff0c;复制&#xff0c;流式传输等&#xff0c;就像在最初上传…

重磅!微软推出首款 ChatGPT 版搜索引擎!

微软近期推出了首款 ChatGPT 版搜索引擎&#xff0c;今天带大家一起来看一下。 一夜之间&#xff0c;全球最大的科技公司仿佛都回到了自己年轻时的样子。 在谷歌宣布「实验性对话式人工智能服务」Bard 之后仅 24 小时&#xff0c;北京时间 2 月 8 日凌晨两点&#xff0c;微软发…

Linux安装达梦8数据库

Linux安装达梦8数据库 服务器系统&#xff1a;centos7 数据库版本&#xff1a;达梦8 先获取安装包&#xff1a;https://eco.dameng.com/download/?_blank 选择相应版本下载,下载完解压之后会得到一个iso文件&#xff0c;把他上传到服务器上&#xff0c;建议上传到/opt目录下…

深度复盘-重启 etcd 引发的异常

作者信息&#xff1a; 唐聪、王超凡&#xff0c;腾讯云原生产品中心技术专家&#xff0c;负责腾讯云大规模 TKE 集群和 etcd 控制面稳定性、性能和成本优化工作。 王子勇&#xff0c;腾讯云专家级工程师&#xff0c; 腾讯云计算产品技术服务专家团队负责人。 概况 作为当前中国…

linux Ubuntu KUbuntu 系统安装相关

系统安装 本来想快到中午的时候调试一下服务器上的http请求接收代码。我的电脑上装的是kali的U盘系统&#xff0c;然后我的U盘居然找不到了(然后之前安装的系统不知道是否是写入软件的原因&#xff0c;没办法解析DNS,我都用的转发的,这让我体验非常差。kali的系统工具很多&…