当前位置: 首页 > 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…...

从Logistic曲线到疫情预测:用Python和SciPy复现SI传染病模型(附代码)

从Logistic曲线到疫情预测&#xff1a;用Python和SciPy复现SI传染病模型&#xff08;附代码&#xff09; 最近在整理疫情数据时&#xff0c;我发现一个有趣的现象&#xff1a;很多地区的感染人数增长曲线都呈现出典型的S型特征。这让我想起了经典的SI传染病模型&#xff0c;它用…...

【技术干货】Qwen 3.6 Plus 实战:用百万上下文打造“代理式”AI 编码工作流

摘要 本文从工程视角拆解 Qwen 3.6 Plus&#xff1a;百万 token 上下文、面向“代理式编码”的能力&#xff0c;以及闭源旗舰开源工具的组合策略。结合实际项目需求&#xff0c;给出如何通过 OpenAI 兼容 API接入该类模型&#xff0c;并构建仓库级代码助手的完整 Python 示例和…...

PanSearch网盘影视资源搜索聚合工具源码解析:集成多引擎搜索技术,畅享跨平台资源检索

在数字化信息爆炸的时代&#xff0c;影视资源的获取方式日益多样化&#xff0c;但如何在海量资源中快速定位所需内容&#xff0c;成为用户面临的一大挑战。PanSearch网盘影视资源搜索聚合工具应运而生&#xff0c;它通过集成多引擎搜索技术&#xff0c;支持百度网盘、阿里云盘等…...

CSS 语音参考

CSS 语音参考 概述 CSS(层叠样式表)是网页设计中的核心组成部分,它允许开发者控制网页元素的样式,包括颜色、布局、字体等。在网页设计中,有时我们需要为特定的元素添加语音提示,以便于视觉障碍者或需要语音辅助的用户使用。本文将详细探讨CSS中语音参考的实现方法,包…...

《Foundation 网格 - 大型设备》

《Foundation 网格 - 大型设备》 引言 在当今科技日新月异的时代,大型设备在各个领域都扮演着至关重要的角色。其中,Foundation 网格作为一项创新技术,正在逐渐改变着我们的生产方式和生活质量。本文将深入探讨Foundation 网格的特点、应用以及未来发展趋势。 一、Founda…...

Vivado DDS IP核的‘光栅化’模式详解:告别相位噪声,提升信号纯度的秘密

Vivado DDS IP核的‘光栅化’模式深度解析&#xff1a;高纯度信号生成的工程实践 在FPGA数字信号处理领域&#xff0c;直接数字频率合成&#xff08;DDS&#xff09;技术因其频率分辨率高、切换速度快等优势&#xff0c;已成为雷达系统、通信设备和测试仪器中的核心模块。Xilin…...

如何通过arknights-ui实现明日方舟界面定制?解锁个性化游戏体验新方式

如何通过arknights-ui实现明日方舟界面定制&#xff1f;解锁个性化游戏体验新方式 【免费下载链接】arknights-ui H5 复刻版明日方舟游戏主界面 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-ui arknights-ui是一个基于H5CSS技术的开源项目&#xff0c;它提供…...

Flutter Web:混合开发的最佳实践

Flutter Web&#xff1a;混合开发的最佳实践一次编写&#xff0c;多端运行。Flutter Web 让前端开发更加高效。一、Flutter Web 的优势 作为一名追求像素级还原的 UI 匠人&#xff0c;我对跨平台解决方案有着严格的要求。Flutter Web 不仅让我们能够使用相同的代码库构建 Andro…...

CSS 变量进阶:动态主题与复杂动画

CSS 变量进阶&#xff1a;动态主题与复杂动画从基础到高级&#xff0c;掌握 CSS 变量的全部潜能。一、CSS 变量的强大之处 作为一名把 CSS 视为流动韵律的 UI 匠人&#xff0c;我深知 CSS 变量的革命性意义。它们不仅让样式代码更易维护&#xff0c;还开启了动态主题、复杂动画…...

《碳硅“虫洞”解:跨认知区域的可穿越通道》(修订版)

《碳硅“虫洞”解&#xff1a;跨认知区域的可穿越通道》 作者&#xff1a;方见华 单位&#xff1a; 世毫九实验室 摘要 本文研究碳硅共生认知场方程在柱对称条件下的精确解&#xff0c;发现存在连接两个分离认知区域的“认知虫洞”。主要结果&#xff1a; 1. 虫洞解的存在性&am…...