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

Java面试题精选:消息队列(一)

1、为什么使用消息队列

问题用意:

其实就是想问一下消息队列有哪些使用场景,你项目中什么业务场景用到了消息队列,有什么技术挑战。使用MQ后给你带来了什么好处

规范回答:

消息队列的常见使用场景很多,但比较核心的有3个:解耦、异步、流量削峰填谷

在这里插入图片描述

1. 解耦

A系统发送数据到B系统再发送数据到C系统。A要时刻考虑B或C会不会挂掉,B也的考虑C会不会挂掉。但使用MQ的话,B将消息发送给MQ后,就不会再考虑后面的事情了。

所以你需要考虑一下自己的项目中是否有类似的场景,就是一个系统或一个模块调用了多个系统或模块,并且互相之间的调用很复杂,维护起来麻烦。并且这个调用也不是必须同步调用接口的,那就可以MQ给它异步化解耦。

2. 异步

A系统接收了一个请求,需要在自己本地写库,还需要在B、C系统写库。自己本地写库要30ms,B、C写库分别需要300ms、450ms。那最终请求总时延就是30+300+450=780ms。异步后,B、C系统分别写库的时间,A系统就不再考虑了。

3.削峰

每天0点到16点,B系统风平浪静,每秒并发请求数是1W个。结果每次一到16点到23点,每秒并发请求数突然会暴增到30万条。但C系统最大处理能力就只能是每秒钟1w请求。这时候就需要添加MQ进行流量的削峰,让系统可以平缓的处理突增的请求

2、消息队列有什么优点和缺点

优点:

  • 解耦
  • 异步
  • 削峰

缺点:

  • 系统可用性降低

    系统引入的外部依赖越多,越容易挂掉,本来A系统调用BCD三个系统的接口就好了,ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ挂了怎么办?MQ挂了,整套系统崩溃了,业务也就停顿了。
    解决方法:MQ可以加集群,防止MQ挂了而影响整个系统的性能

  • 系统复杂性提高

    添加MQ后,如何保证消息没有重复消费?如何处理消息丢失的情况?如何保证消息传递的顺序性

  • 一致性问题
    A系统处理结束后直接返回成功,可能都以为这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,就会导致数据不一致。

所以消息队列实际是一种非常复杂的架构,引入它有很多好处,但是也需要针对它带来的坏处做各种额外的技术方案和架构来进行规避。

3、常见消息队列比较

在这里插入图片描述

4、如何解决重复消费

消息被重复消费,就是消费方多次接收到了同一条消息。根本原因就是,第一次消费完之后,消费方给 MQ 确认已消费的反馈,MQ 没有成功接受。比如网络原因、MQ 重启等。所以MQ 是无法保证消息不被重复消费的,只能业务系统层面考虑

不被重复消费的问题,就被转化为消息消费的幂等性的问题。幂等性就是指一次和多次请求的结果一致,多次请求不会产生副作用。

保证消息消费的幂等性可以考虑下面的方式

  • 给消息生成全局 id,消费成功过的消息可以直接丢弃。消息中保存业务数据的主键字段,结合业务系统需求场景进行处理,避免多次插入。是否可以根据主键多次更新而并不影响结果等

5、让你来设计一个消息队列,你会怎么设计

(1)数据存储角度
理论上,从速度来看,分布式文件系统 > 分布式KV(持久化)> 数据库;而可靠性却截然相反,如果追求性能可以基于文件系统的顺序写。

(2)高可用角度:分区+复制+选举的思想

(3)网络框架角度:选用高效的Netty框架,producer 同步异步发送消息,consumer 同步异步接收消息。同步能够保证结果,异步能够保证性能。

6、有几百万消息持续积压几小时,说说怎么解决?

  发生了线上故障,几千万条数据在MQ里积压很久。是修复consumer的问题,让他恢复消费速度,然后等待几个小时消费完毕。这是个解决方案。不过有时候我们还会进行临时紧急扩容。

   一个消费者一秒是1000条,一秒3个消费者是3000条,一分钟是18万条。1000多万条,所以如果积压了几百万到上千万的数据,即使消费者恢复了,也需要大概1小时的时间才能恢复过来。

一般这个时候,只能操作临时紧急扩容了,具体操作步骤和思路如下:
(1)先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉。
(2)新建一个topic,partition是原来的10倍,临时建立好原先10倍或者20倍的queue数量。
(3)然后写一个临时的分发数据的consumer程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍数量的queue。
(4)接着临时征用10倍的机器来部署consumer,每一批consumer消费一个临时queue的数据。

  这种做法相当于是临时将queue资源和consumer资源扩大10倍,以正常的10倍速度来消费数据。等快速消费完积压数据之后,再恢复原先部署架构,重新用原先的consumer机器来消费消息。

相关文章:

Java面试题精选:消息队列(一)

1、为什么使用消息队列 问题用意: 其实就是想问一下消息队列有哪些使用场景,你项目中什么业务场景用到了消息队列,有什么技术挑战。使用MQ后给你带来了什么好处 规范回答: 消息队列的常见使用场景很多,但比较核心的…...

宝塔面板启用 QUIC 与 Brotli 的完整教程

环境 系统:Ubuntu 22.04.4 LTS x86_64 宝塔版本:7.7.0 (可使用本博客提供的一键安装优化脚本) nginx版本:1.26.1 开放UDP端口 注意:在你的服务器商家那里也要开放443 udp端口 sudo ufw allow 443/udp然后重新加载 UFW 以使新…...

Linux 进程调度(二)之进程的上下文切换

目录 一、概述二、上下文切换的实现1、context_switch2、switch_mm3、switch_to 三、观测进程上下文切换 一、概述 进程的上下文切换是指在多任务操作系统中,当操作系统决定要切换当前运行的进程时,将当前进程的状态保存起来,并恢复下一个要…...

Oracle事物临时表

在Oracle数据库中,事务临时表是一种特殊的表类型,主要用于存储在事务处理过程中产生的临时数据。这些表的数据只对当前会话或事务可见,并且在事务结束时会自动清除。 事务临时表的特点 生命周期: 事务临时表中的数据在事务提交或…...

看图学sql之sql的执行顺序

学完前面的内容,我们已经掌握了基本的sql语法了,那我们学的 select, distinct, from, where,group by, having, order by, limit 他们具体的执行顺序是什么样的呢? 语法: SELECT distinct column1, column2 FROM table1 join …...

百日筑基第四十五天-从JAVA8走到JAVA9

JAVA9新特性 Java 9发布于 2017 年 9 月 21 日 。 快速创建不可变集合 增加了List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合(有点参考 Guava 的味道): List.of("Java", "C"); Set.of…...

力扣第五十七题——插入区间

内容介绍 给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区…...

跟《经济学人》学英文:2024年08月03日这期 India’s economic policy will not make it rich

India’s economic policy will not make it rich A new World Bank report takes aim at emerging-market growth plans 原文: The developing world has fallen back in love with economic planning. As protectionism sweeps the West, poor countries are n…...

js 深拷贝、浅拷贝深度解析

赋值操作: let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量,其实就是将这个对象在栈内存中的引用地址复制给了这个变量,这两个对象指向堆内存中的同一个…...

CSS文本两端对齐

背景 如果我们要写了列表或表单类的样式&#xff0c;名称长短不一&#xff0c;但是想要两端对齐&#xff0c;如下面这样的&#xff1a; 你是怎么写的&#xff1f; 是这样的吗&#xff0c;在HTML里调整加空格&#xff1a; <ul><li>用户名</li><li>账 …...

C#中的foreach和自定义比较

在C#中foreach不能修改集合里面的值 在C#中&#xff0c;使用 foreach 循环遍历集合时&#xff0c;通常不建议修改集合中的元素&#xff0c;因为 foreach 循环是针对集合的枚举器进行操作的&#xff0c;而枚举器通常不支持修改集合中的元素。如果尝试在 foreach 循环中修改集合…...

有序转化数组(LeetCode)

题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 &#xff0c;计算函数值 &#xff0c;请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…...

大数据信用报告查询有什么作用?怎么选择查询平台?

随着互联网的快速发展&#xff0c;人们的金融行为越来越多地依赖于网络平台。然而&#xff0c;网络上的金融交易存在着一定的风险&#xff0c;为了有效地防范这些风险&#xff0c;金融机构采用了大数据技术进行风险控制&#xff0c;下面&#xff0c;小易大数据平台将详细介绍大…...

import cv2ModuleNotFoundError: No module named ‘cv2‘

import cv2 ModuleNotFoundError: No module named cv2 (base) PS D:\CAMERA-D861T\LabelImg> pip3 install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2 办法1 试了无…...

[Modbus] Modbus协议开发-基本概念(一)

历史 ModBus官网是Modicon&#xff08;Modicon早年已被施耐德收购&#xff09;公司为其PLC通讯而开发的一种通讯协议。 概述 通过Modbus协议&#xff0c;控制器之间、或控制器经由网络&#xff08;如以太网&#xff09;可以和其它设备之间进行通信。 优点 免费、好用、成熟…...

爬虫代理的使用:提升爬虫效率

爬虫代理的基本概念 爬虫代理&#xff0c;简单来说&#xff0c;就是位于客户端和目标服务器之间的一个中转站。当爬虫发起请求时&#xff0c;不是直接发送给目标服务器&#xff0c;而是先发送给代理服务器&#xff0c;再由代理服务器转发给目标服务器。目标服务器响应后&#…...

【gcc】基于gpt和python的流程和延迟梯度分析

Core Flow and Algorithm Concepts of GCC (Google Congestion Control) 【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)参考大神的理解发送码率(send bitrate)影响了网…...

前端CSS总结

目录 前言 正文 CSS基础介绍&#xff1a; CSS选择器&#xff1a; 元素选择器&#xff1a; id和class选择器&#xff1a; 后代选择器和群组选择器&#xff1a; 盒子模型 content&#xff1a; padding&#xff1a; border&#xff1a; margin&#xff1a; 字体样式 …...

Linux/C 高级——指针函数

1.概念 本质是函数&#xff0c;函数的返回值为指针。类比着指针数组。 指针数组&#xff1a;本质是数组&#xff0c;数组中存放指针。 数据类型 *数组名[元素个数]; int a[2][3]; int *arr[2] {a[0],a[1]}; //*(*(arri)j) *(arr[i]j) arr[i][j] 2.定义格式 格式&#xff1a; 数…...

GRU门控循环单元【数学+图解】

文章目录 1、简介2、门控机制3、公式4、图解GRU4.1、重置门和更新门4.2、候选隐藏状态和隐藏状态⭐ 5、LSTM与GRU的对比6、应用7、训练技巧 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff…...

降AI率工具8元和3元的,处理80%+有区别吗

“8元一千字太贵了&#xff0c;3元那个不是也能用吗&#xff1f;” 这个问题很合理&#xff0c;特别是对于字数多的毕业论文&#xff0c;价格差距相当可观。 4万字的论文&#xff1a; 8元工具&#xff1a;320元3元工具&#xff1a;约130元 差了190元。那这190元换来的是什么…...

Excel处理地理数据进阶:除了度分秒转换,这些隐藏技巧让你效率翻倍

Excel地理数据处理进阶&#xff1a;从度分秒转换到地图可视化的全流程实战 当你面对一份包含数百条经纬度数据的地理信息表格时&#xff0c;单纯掌握度分秒转换公式远远不够。真正的高效工作流需要将数据清洗、格式转换、可视化呈现串联成自动化流程。本文将带你超越基础公式&a…...

学生成绩管理系统|基于springboot + vue学生成绩管理系统(源码+数据库+文档)

学生成绩管理系统 目录 基于springboot vue学生成绩管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue学生成绩管理系统 一、前言 博主介绍&…...

游戏开发中的乒乓缓存实战:Unity双缓冲技术如何提升渲染性能

游戏开发中的乒乓缓存实战&#xff1a;Unity双缓冲技术如何提升渲染性能 在Unity游戏开发中&#xff0c;渲染性能优化一直是开发者关注的焦点。当画面复杂度和特效层级不断提升时&#xff0c;传统的单缓冲机制往往难以满足流畅渲染的需求&#xff0c;这时乒乓缓存&#xff08;P…...

如何快速配置MangoHud快捷键:从零开始的游戏性能监控终极指南

如何快速配置MangoHud快捷键&#xff1a;从零开始的游戏性能监控终极指南 【免费下载链接】MangoHud A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more. 项目地址: https://gitcode.com/gh_mirrors/ma/MangoHud 你是否厌倦了游戏性…...

AI Agent Harness Engineering 零售场景应用:智能货架、库存管理与个性化推荐

AI Agent Harness Engineering 零售场景全栈应用:从智能货架机器人到千人千面实时导购 关键词 AI Agent Harness(智能体协同框架)、零售数字化、多模态智能体、强化学习库存调度、个性化推荐图谱、边缘云协同推理、供应链韧性优化 摘要 当传统“人-货-场”零售三要素被AI重…...

FNF-PsychEngine完全指南:从零开始打造你的音乐游戏

FNF-PsychEngine完全指南&#xff1a;从零开始打造你的音乐游戏 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF-PsychEngine是一款功能强大的Friday Night Funkin开源游…...

AI智能体架构:更复杂不一定更好

为什么更智能的智能体架构并不总能提升效果 我对智能体将给知识工作带来的影响依然持乐观态度。正如我在之前的文章中所指出的&#xff0c;那些由明确规则和成熟系统塑造的领域&#xff08;包括会计和合同管理&#xff09;已经看起来非常适合这种自动化。但即使机遇真实存在&am…...

FPGA新手必看:Xilinx Vivado除法器IP核(divider)从配置到仿真的避坑指南

FPGA实战&#xff1a;Xilinx Vivado除法器IP核高效配置与仿真全攻略 第一次在Vivado中调用除法器IP核时&#xff0c;我盯着仿真波形里那些红色高阻态信号整整一个下午。作为FPGA开发者&#xff0c;我们都经历过这种挫败感——明明按照文档一步步操作&#xff0c;结果却不如预期…...

从ItemCF到Swing:手把手教你用Python实现小红书式协同过滤召回(附代码避坑)

从ItemCF到Swing&#xff1a;Python实战小红书式协同过滤召回系统 在内容社区和电商平台的推荐系统中&#xff0c;协同过滤算法始终占据着核心地位。不同于深度学习推荐模型对海量数据和算力的依赖&#xff0c;基于物品和用户的协同过滤方法以其直观的可解释性和稳定的效果&…...