面向面试知识-消息队列

news2025/1/12 18:16:04

面向面试知识-消息队列

参考文章:消息队列(mq)是什么?、重复消费
老坑还没填完,就又开一个新坑:
Rocket MQ;Message Queue。

起始问题

  1. 为什么引入MQ?
  2. MQ适用于哪些场景下的哪些问题?
  3. MQ会遇到哪些问题?
  4. 如何解决这些问题?

为什么引入MQ?

  1. 异步处理:将连续的多任务异步处理在这里插入图片描述
    优化为:在这里插入图片描述

;比如:订单微服务,需要远程访问商品库存微服务,但是这样远程的整体响应速度较慢,为了解决速度慢的问题,可以加MQ进行异步处理。。如果异步处理失败怎么办?

如果用线程池,会出现:
a) 业务过多,每次加一个,要调用一个接口还要重新发布系统,效率低下。

  1. 解耦;如果库存微服务挂了,存在于MQ中的消息可以在其重启后,继续执行消息,即解耦;
  2. 削峰:虽然延长了处理时间,但是一定程度上保证了服务不挂掉;当系统处理不过来时,队列一定程度上可以削峰;
    在这里插入图片描述
    有了MQ之后,订单微服务在完成支付之后,只需要将支付成功的消息放入消息队列中,其他相关服务订阅消息,只要监听到该消息,就依次进行业务处理。异步处理+解耦,极大的加快了订单微服务的速度。
    如果只管订单微服务系统,那如果积分或者短信出错怎么办?:涉及到分布式事务知识点,以后再来填坑。

MQ的主要缺点

系统复杂度

是否涉及耦合的问题?:也就是之前的解耦主要指的是哪方面的解耦?
多了个中间件,就需要考虑各种问题,比如重复消费、消息丢失、顺序消费等,用了之后就是贼烦。
详情见文章:

数据一致性

分布式系统的通病
在MQ中,有分布式事务,把下单、优惠券、积分等都放在一个事务中,要么一起成功,要么一起失败。

可用性

后续展开;

如何选择中间件

比如主流的Kafka、Active MQ、Rabbit MQ、RocketMQ这几种
在这里插入图片描述
RocketMQ与Dubbo都是出自阿里之手,其架构设计很相像。
Kafka是消息队列的标杆,在其他类似于大数据领域也有很好的表现。
没有最好的技术,之后最合适的技术。不要为了用技术而用。

你的项目中,结合MQ实现了什么功能?

补充内容

  • 同步与异步:同步,比如进程A调用进程B,A在B完成之前一直等待,就是同步;A在B工作期间干别的事,就是异步。
    在这里插入图片描述
    在这里插入图片描述
    同步可以是同一线程也可以是不同线程;
    异步调用通常是和I/O操作等耗时较高的任务如影随形,像磁盘文件读写、网络数据的首发、数据库操作等。
    在这里插入图片描述
    异步的函数调用方,可以在函数调用之后继续执行其他内容。

消息的重复消费和顺序消费:

在这里插入图片描述
如果有服务发生错误,比如积分系统,则对应的重试机制会抛出异常,让重新发送一次。如果重新发送消息,其他的活动也都能看到这条“新”消息,如何避免重复消费该消息呢?
在这里插入图片描述
接口幂等

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

在这里插入图片描述
帅气面试官您好,一般幂等,我会分场景去考虑,看是强校验还是弱校验,比如跟金钱相关的场景那就很关键呀,就做强校验,别不是很重要的场景做弱校验

强校验:比如你监听到用户支付成功的消息,你监听到了去加GMV是不是要调用加钱的接口,那加钱接口下面再调用一个加流水的接口,两个放在一个事务,成功一起成功失败一起失败。每次消息过来都要拿着订单号+业务场景这样的唯一标识(比如天猫双十一活动)去流水表查,看看有没有这条流水,有就直接return不要走下面的流程了,没有就执行后面的逻辑。

弱校验:这个简单,一些不重要的场景,比如给谁发短信啥的,我就把这个id+场景唯一标识作为Redis的key,放到缓存里面失效时间看你场景,一定时间内的这个消息就去Redis判断。

顺序消费

一般都是同个业务场景下不同几个操作的消息同时过去,本身顺序是对的,但是你发出去的时候同时发出去了,消费的时候却乱掉了,这样就有问题了。

有时遇到这种情况:把所有的操作消息怼到队列里面去,然后慢慢消费的,那问题就来了呀,我们在数据库同时对一个Id的数据进行了增、改、删三个操作,但是你消息发过去消费的时候变成了改,删、增,这样数据就不对了。

在这里插入图片描述
生产者消费者一般需要保证顺序消息的话,可能就是一个业务场景下的,比如订单的创建、支付、发货、收货。
一个topic下有多个队列,为了保证发送有序,RocketMQ提供了MessageQueueSelector队列选择机制,他有三种实现:
在这里插入图片描述
选择哈希,根据订单号将对同一行数据的操作(创建、支付、发货、收获)映射到同一队列中,进而都在同一消费者端消费。
==为了保证消息的顺序,需要同步,只有当订单的创建消息发送成功,才发送支付消息。==这样就保证了消息的顺序性。
RocketMQ的topic内的队列机制,可以保证存储满足FIFO,剩下的只需要消费者顺序执行。

RocketMQ仅保证顺序发送,顺序消费由消费者业务保证!!!

能聊一下分布式事务吗?

分布式事务在现在遍地都是分布式部署的系统中几乎是必要的。
事务是恢复和并发执行的基本单位:要么一起执行,要么都不执行的一组数据库操作的集合。
事务的隔离级别、ACID(原子性、一致性、独立性 隔离性、持久化)

原子性:一个事务是一个不可分割的工作单位,包括的操作要么都做,要么都不做。
一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性:一个事务的执行不能被其他事务干扰。即某一事务的内部操作以及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性:一个事务一旦提交,对数据库中的数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

分布式事务,保证积分、优惠券等的相关业务的正确运行。

2pc,两段式提交:
在这里插入图片描述

最终一致性

在这里插入图片描述
好复杂:

  • 业务主动方本地事务提交失败,业务被动方不会受到消息的投递。
  • 只要业务主动方本地事务执行成功,那么消息服务一定会投递给下游的业务被动方,并最终保证业务被动方一定能成功消费该消息(消息成功或失败,即最终一定会有一个最终态)。
    离开业务的技术没有意义,离开技术的业务没有底气
    没有最完美的系统,只有最适合的系统。

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

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

相关文章

4 vCPU 实例达成 100 万 JSON API 请求/秒的优化实践

“性能工程” (Performance engineering)是个日渐流行的概念。顾名思义“性能工程”是包含在系统开发生命周期中所应用的一个技术分支,其目的就是确保满足非功能性的性能需求,例如:性能、可靠性等。由于现代软件系统变…

wifi分销大师小程序v4.0.5独立版saas系统源码+前端

WiFi大师是一款专为商家店内用户设计的WiFi连接小程序。它的出现有效解决了商家在为客户提供WiFi服务的过程中遇到的各种问题,为消费者提供了更加高效快捷的上网方式。 除此之外,WiFi大师小程序还为商家提供了一些额外的功能,例如店铺优惠券…

2023年蓝帽杯取证复现

案件介绍 2021 年 5 月,公安机关侦破了一起投资理财诈骗类案件,受害人陈昊民向公安机关报案称其在微信上认识一名昵称 为 yang88 的网友,在其诱导下通过一款名为维斯塔斯的 APP ,进行投资理财,被诈骗 6 万余万元。接警…

84、Redis客户端-->可视化图形界面工具(Another Redis Desktop Manager)的下载、安装及初步使用

Redis客户端–>可视化图形界面工具(Another Redis Desktop Manager)的下载、安装及初步使用 ★ Redis客户端: ▲ Redis自带的命令行工具(简陋): CLI工具,重新打开一个命令行窗口,在其中输入如下命令&…

5请求处理流程

产品代码都给你看了,可别再说不会DDD(五):请求处理流程 # 这是一个讲解DDD落地的文章系列,作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云(https://www.…

APP产品经理的主要内容(合集)

APP产品经理的主要内容1 职责: 1.成产品的功能、流程、界面设计,协调设计资源落实产品交互、原型设计; 2.负责产品上线后客户反馈跟踪,并根据产品规划策略和客户反馈优先级落实产品改进设计计划,不断提升竞争力。 3.关注竞争对…

经典网络解析(三)GoogleNet | Inception块,1*1卷积核,辅助分类器 整体结构代码

文章目录 1. 串联结构VGG存在的问题2. GoogleNet结构解析2.1 Inception块2.2 最后采用平均池化操作2.3 辅助分类器 3.代码实现3.1 实现Inception块3.2 各个块依次实现 4 **贡献总结** 之前讲了 AlexNet的解析经典网络(一) AlexNet逐层解析 | 代码、可视化、参数查看&#xff01…

2021 ICPC澳门题解(8/11)

AC情况 赛中通过赛后通过暂未通过A√B○C√D-E√F√G○H-I○J-K√ 整体体验 easy:AKF mid:CEGI hard:DHBJ 心得 整体感觉出的题比较传统,严格的卡精度/卡时间 题解 A. So Ill Max Out My Constructive Algorithm Skills&…

mysql explain学习记录

参考了公司内相关博客,实践并记录下,为后面分析并优化索引做准备。 MySQL explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好的分析SQL语句的执行情况。 每当遇到执行慢(在业务角度)的SQL,…

LeetCode 75-02:字符串的最大公因子

前置知识:使用欧几里得算法求出最大公约数 func gcdOfStrings(str1 string, str2 string) string {if str1str2 ! str2str1 {return ""}return str1[:gcd(len(str1), len(str2))] }func gcd(a, b int)int{if b 0{return a}return gcd(b, a%b) }

Leetcode刷题笔记--Hot51-60

1--环形链表II 主要思路: 快慢指针,快指针每次走两步,慢指针每次走一步; 第一次相遇时,假设慢指针共走了 f 步,则快指针走了 2f 步; 假设起点到环入口结点的长度为 a(不包括入口结点…

无需root,删除安卓内置应用

今天在家里反到一台比较老的安卓手机,直接恢复出厂设置,开机后一堆自带的应用,卡的一匹,于是就想办法把内置软件卸载掉。 1、手机开启开发者模式,打开usb调试。 2、手机与安卓连接,然后执行adb devices&a…

php框架thinkPHP6的安装教程

1,composer官网下载最新版本 composerhttps://getcomposer.org/download/ 2,双击下载后的运行文件,一直点击next就行了 上面这个路径根据自己安装的php版本位置选择(没有的可以下载一个phpstudy),最后需要…

CUDA学习笔记0924

一、nvprof分析线程束和内存读写 (1)线程束占用率分析 线程束占用率:nvprof --metrics achieved_occupancy (2)内存读写分析 内核数据读取效率:nvprof --metrics gld_throughput 程序对设备内存带宽利…

【刷题笔记9.24】LeetCode:二叉树最大深度

LeetCode:二叉树最大深度 1、题目描述: 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二、思路与算法 如果我们知道了左子树和右子树的最大深度 lll 和 rrr,…

动态规划:回文串问题(C++)

动态规划:回文串问题 前言回文串问题1.回文子串(中等)2.回文串分割IV(困难)3.分割回文串II(困难)4.最长回文子序列(中等)5.让字符串成为回文串的最小插入次数&#xff08…

httpd-tools的压力测试

httpd-tools httpd-tools 是一个包含一些基本工具和实用程序的软件包,用于与 Apache HTTP Server 进行交互和管理。它提供了一些常用的命令行工具,可以帮助你配置、管理和监控 Apache 服务器。ApacheBench 工具,用于进行性能测试和负载压力测…

文献阅读:LIMA: Less Is More for Alignment

文献阅读:LIMA: Less Is More for Alignment 1. 内容简介2. 实验设计 1. 整体实验设计2. 数据准备3. 模型准备4. metrics设计 3. 实验结果 1. 基础实验2. 消解实验3. 多轮对话 4. 结论 & 思考 文献链接:https://arxiv.org/abs/2305.11206 1. 内容简…

面试算法13:二维子矩阵的数字之和

题目 输入一个二维矩阵,如何计算给定左上角坐标和右下角坐标的子矩阵的数字之和?对于同一个二维矩阵,计算子矩阵的数字之和的函数可能由于输入不同的坐标而被反复调用多次。例如,输入图2.1中的二维矩阵,以及左上角坐标…

SAP 操作:怎么设定屏幕前台字段显示/编辑

文章目录 前言一、步骤设定方式 前言 SAP将字段放进群组,通过对群组进行控制。 一、步骤 后勤常规-物料主数据-字段选择 设定方式 点击后面绿色按钮2.