当前位置: 首页 > news >正文

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

目录儿

  • 常见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

相关文章:

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

目录儿常见MQRocketMQ2、RocketMQ测试可用MQ常见问题1、幂等性问题2、如何保证消息不丢失3、消息积压问题4、事务消息设计分析常见MQ RocketMQ RocketMQ又四部分组成 NameServer 同步Broker服务信息,给消费者和生产者提供可用Broker的服务信息。Broker 消息存储业…...

网关服务限流熔断降级分布式事务

目录一、网关服务限流熔断降级二、Seata--分布式事务1、分布式事务基础①事务②本地事物③分布式事务④分布式事务的场景2、分布式事务解决方案①全局事务②最大努力通知③TCC事务3、Seata介绍4、Seata实现分布式事务控制①案例基本代码(异常模拟)②启动…...

JVM——7JVM调优实战及常量池详解

Arthas工具的使用 阿里巴巴开源的java诊断工具 下载插件 上传至linux环境 在linux跑起来的java项目,可以用Arthas进行查看 项目上线前的时候没问题,上线了就出问题 ,用来查看线上代码 jad 项目名 :反编译线上正在运行的代码 用…...

子串分值【第十一届】【省赛】【A组】

问题描述 对于一个字符串 s,我们定义 s 的分值 f(s) 为 s 中恰好出现一次的字符个数。例如 f("aba")1,f("abc")3, f("aaa")0。 现在给定一个字符串 s[0..n−1](长度为 n),请你计算对于…...

SpringCloud 中 Config、Bus、Stream、Sleuth

文章目录🚏 第十三章 分布式配置中心🚬 一、Config 概述🚬 二、Config 快速入门🚭 config-server:🛹 1、使用gitee创建远程仓库,上传配置文件🛹 2、导入 config-server 依赖&#x1…...

Quantum 构建工具使用新的 TTP 投递 Agent Tesla

Zscaler 的研究人员发现暗网上正在出售名为 Quantum Builder 的构建工具,该工具可以投递 .NET 远控木马 Agent Tesla。与过去的攻击行动相比,本次攻击转向使用 LNK 文件。 Quantum Builder 能够创建恶意文件,如 LNK、HTA 与 PowerShell&…...

浏览器中的 JavaScript 执行机制

思维导图 本文为反复学习极客时间-《浏览器的工作原理与实践》-浏览器中的 JavaScript 执行机制章节中的一些思考与记录。 一些重要概念 变量提升 所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分…...

kafka集群搭建及问题

一、zookeeper集群搭建 1、创建文件夹 cd /home mkdir zookeeper 2、下载 cd zookeeper wget https://downloads.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz 解压到当前文件夹 tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz 文件夹重命…...

不要忽视web渗透测试在项目中起到的重要性

在当前数字化环境中,IT的一个里程碑式增长便是公司组织和企业数字化。为了扩大市场范围和方便业务,许多组织都在转向互联网。这导致了一股新的商业浪潮,它创造了网络空间中的商业环境。通过这种方式,公司和客户的官方或机密文件都…...

Early Stopping中基于测试集(而非验证集)上的表现选取模型的讨论

论文中一般都是用在验证集上效果最好的模型去预测测试集,多次预测的结果取平均计算准确率或者mAP值,而不是单纯的取一次验证集最好的结果作为论文的结果。如果你在写论文的过程中,把测试集当做验证集去验证的话,这其实是作假的&am…...

appium ios真机自动化环境搭建运行(送源码)

appium ios真机自动化环境搭建&运行(送源码) 目录:导读 (1)安装JDK,并配置环境变量,方法如下: (2)安装Xcode、Xcode commandline tools和iOS模拟器 &…...

米尔基于ARM嵌入式核心板的电池管理系统(BMS)

BMS全称是Battery Management System,电池管理系统。它是配合监控储能电池状态的设备,主要就是为了智能化管理及维护各个电池单元,防止电池出现过充电和过放电,延长电池的使用寿命,监控电池的状态。 图片摘自网络 电池…...

Java后端项目IDEA配置代码规范检查,使用checkStyle实现

最近的Java后端项目想实现代码的规范检查,调研了一圈,终于找到了简单的方式实现:以下是常见的几种方案: 1、在客户端做 git hook,主要是用 pre-commit 这个钩子。前端项目中常见的 husky 就是基于此实现的。但缺点也很…...

Nginx_4

Nginx负载均衡 负载均衡概述 早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了&#xff0c…...

linux Ubuntu KUbuntu 系统安装相关

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

个人信息保护认证

个人信息保护认证是证明个人信息处理者在认证范围内开展的个人信息收集、存储、使用、加工、传输、提供、公开、删除以及跨境等处理活动符合认证依据标准要求。适用范围 本规则依据《中华人民共和国认证认可条例》制定,规定了对个人信息处理者开展个人信息收集、存储…...

Negative Prompt in Stable Diffusion

必读链接:https://www.reddit.com/r/StableDiffusion/comments/z7salo/with_the_right_prompt_stable_diffusion_20_can_do/ A lot of people have noticed that Negative Prompt works wonders in 2.0, and works even better in 2.1. Negative hints are the op…...

MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量

介绍MLX90316是Tria⊗is旋转位置传感器,提供在设备表面旋转的小偶极磁铁(轴端磁铁)的绝对角位置。得益于其表面的集成磁集中器(IMC),单片设备以非接触式方式感知应用磁通量密度的水平分量。这种独特的传感原理应用于旋转位置传感器,可在机械(…...

Reflections反射包在springboot jar环境下扫描不到class排查过程

需求: 要实现指定pkg(如com.qiqitrue.test.pojo)扫描包下所有class类信息:使用代码如下 使用的版本:0.10.2(截至目前是最新版)发现只能在idea编译期间可以获取得到(也就是在开发阶段…...

黑马】后台项目171集

将近一个月没有练习了,找到之后果然打不开出了问题【问题】运行代码打开网页后,发现不能正常登录,一开始还以为是密码记错了,后来发现是数据库没有正常启动,phpstudy中的数据库一直是启动状态,关闭不了。【…...

Qt 5 架构和特点

Qt 5 模块构架: 模块:功能:Qt CoreQt 5 的核心类库,每个模块都建立在Core上Qt GUI图形用户界面开发的最基础的类库Qt Widgets提供c用户界面部件(是对Qt GUI的拓展)Qt SQL对数据库进行操作Qt Multimedia、…...

转换符说明使用方法(在printf函数中)

目录 一些常见的转换说明及打印结果: printf()的转换说明修饰符 printf()函数打印数据指令时要与代打印数据的类型相匹配才行。 如%d %c %ld......这些符号叫做转换说明。代表着数据转化成显示的形式。 一些常见的…...

针灸-基本任脉督脉

这里写自定义目录标题 丈量 同身丈下针深浅一般入穴的方法成人 幼儿 不同入穴方式现代常用针概念十二经 纳天干**天干**地支表里关系筋络任脉中脘穴:梅花灸巨阙穴廉泉穴督脉长强腰俞命门阳关悬枢脊中筋缩眼诊 癫痫至阳消渴...

信息系统与信息化

1.1 信息系统与信息化 1.1.1 信息的基本概念 信息质量属性(掌握)信息传输模型 1.1.2 信息系统的基本概念1.1.3 信息化的基本概念 信息化的五个层次信息化基本内涵信息化的基本概念(了解)六要素关系图(掌握) 1.1.4 信息系统生命周…...

解决axios异步请求问题(异步变为同步)

遇到的问题 在目前一个需求中,我需要等待axios请求完成后,判断请求是否出现异常,然后来判断是否关闭弹窗 修改后大概代码如下: async submitForm() {let flag false//表单验证,默认通过let formValidation truethis…...

【Django】云笔记项目

一、介绍 用户可在系统中记录自己的笔记,用户的数据被存储在云笔记平台;用户和用户之间的数据为隔离存储(登陆后才能使用相关笔记功能,且只能查阅自己的笔记) 二、功能拆解 1、用户模块 注册:成为平台…...

LeetCode——1797. 设计一个验证系统

一、题目 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了,那么它会在 currentTime (可能与之前的 currentTime 不同&am…...

java Resource

参看本文前 你要先了解 spring中的 Autowired和Qualifier 注解 如果之前没有接触过 可以查看我的文章 java spring 根据注解方式按(类型/名称)注入Bean 然后 创建一个java项目 引入spring注解方式 所需要的包 然后 在src下创建包 我们这里直接叫 Bean 在Bean下创建包 叫UserD…...

ArkTS语法(声明式UI)

页面级变量的状态管理 装饰器装饰内容说明State基本数据类型,类,数组修饰的状态数据被修改时会触发组件的build方法进行UI界面更新。Prop基本数据类型修改后的状态数据用于在父组件和子组件之间建立单向数据依赖关系。修改父组件关联数据时,…...

自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改,删除,新增操作

Jmeter也可以连接mysql数据库,通过JDBC去调用数据库内的参数到HTTP请求中进行接口测试,可以说是相当方便 自动化测试实战篇(7)jmeter连接mysql数据库,实现单表、多表、三表查询,并对表中数据进行修改&#…...

wordpress缩略图顺序/网站品牌推广策略

...

做建筑钢材的b2b网站有哪些/游戏代理300元一天

目录 负载均衡配置:修改Nginx配置文件 Nginx负载均衡策略优化: 1.轮询(默认方式) 2.权重:通过weight参数在轮询策略的基础上设置被访问的几率. (各节点机器硬件配置不一致时可使用) 3.ip_hash(适合有状态的服务):指定负载均衡按照客户端ip进行分配,此策略确 保用一个ip客户端…...

解决wordpress主题缺少style.css无法安装的方法/谷歌seo推广培训班

一、docker是什么 1、为什么会有docker 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后…...

吉林做网站多少钱/重庆百度推广优化

多线程面试时,经常会考到一个用3个线程循环打印abcabcabc的问题 现用两种方法做了一下,也看了网上的其他 人的思路,大差不差一个对象,一个状态位控制,代码如下:package com.myTread.abcabc.my;import java.…...

的网站建设/在线的crm系统软件

文章目录0、打包配置(Artifacts)1、tomcat 的使用2、配置注释模板3、配置快捷键模板0、打包配置(Artifacts) Project -> Structure -> Artifacts 1、tomcat 的使用 1.在下拉列表中,点击Edit Configuration […...

县建设局 协会网站/域名关键词排名查询

中新网1月17日电 据欧联网援引欧联通讯社报道,当地时间1月15日晚,一名搭乘意大利航空公司班机的30岁埃及男子,试图强行滞留意大利未果后被遣返。男子遭遣返登机后趁机舱关门之际跳机逃往机场起降区域,引发机场大乱被迫临时关闭&am…...