Java面试题——你们怎么解决消息重复消费?

一、前言

我前几天建了一个java讨论的qq群(920868614),拉了几个人在讨论。这几天和群友聊的时候,有个群友提了一个面试问题,大家回答的时候有个群友(简哥,他qq昵称就叫简哥)提出了一个不同寻常的论点,然后就讨论了一上午的讨论。

本人技术有限无法评判对错,只能总结下群友(简哥)和其他群友的观点发上来。

二、问题

面试官:如何解决消息队列重复消费的?

群友:通过幂等、数据库消息表、状态机...

简哥:正常使用不会重复消费 ,直接反问他,他是怎么用的?代码是怎么写的?

我:消息队列我都没用过哎,那是啥?

三、辩论

简哥观点上的冲突引发了讨论,群友使用质疑,简哥质疑群友的质疑。因为是qq群聊天的形式。群友问答比较散,图不好截,聊着聊着还会偏题。 所以我大体整理下几个关键问答。

群友:正常使用也有问题,比如发送消息后消息队列接收成功,但是回告的时候出现网络波动宕机。 导致客户端没有正确接收,客户端重发消息自然会产生重复的消息。

简哥:每条消息都会有一个id或发送时间,你都重发了这个肯定是不一样的。内容不一样那怎么能说是重复消息,只能说这两条消息高度相似。

群友:可消费端接收这两条消息,比如订单扣库存场景,不就重复扣库存了嘛。

简哥:那是你没做幂等,这和消息队列没关系,就算你用接口调也会重复扣。

群友:这种减库存的怎么加幂等?

简哥: 方法其实挺多的。比如单据减库存, 在库存前面加个库存流水表。 单据先生成流水,流水去减库存。减的时候判断单据的流水是否存在。 怎么实现都行,无非就是考虑怎么适合自己系统的。

群友:那消费的时候,因为宕机或者负载重设出现部分消息没有接收到消息确认通知,导致重新发送一次消息,这总是重复了吧。

简哥:那你这么说的话确实是重复了。 但我个人建议,系统不是那种百万级别并发的时候,不要去考虑这种情况。一般来讲这种情况的解决方案也可以用上面说的幂等和合理的业务设计去解决。

简哥:但如果系统并发太大的话,比如还是我上面说的幂等判断,他的单条链路就变成:判断流水不存在-> 新增流水-> 扣减库存。在执行过程中(未提交事务)这时候有条重复的消息进来,流水不存在,就可以绕过幂等。 导致库存重复扣。

群友: 加锁呀,库存金额这种比较重要,一般不都是加锁的。redis的分布式锁。

简哥:可以是可以,但是到这种体量的时候redis也不可靠,redis分布式锁是互斥的,会极大的影响并发。最重要的是,库存容易乱序,因为redis的分布式锁是无序的。

群友: 换数据库加乐观锁是不是可以解决, update 后面跟where条件的那个。

简哥:还记得我们的前提嘛,现在是百万并发的大型系统。但凡大点的系统,性能瓶颈都在数据库上。因为这个完全是把压力转嫁给了数据库。 这样搞长事务会非常多,尤其是库存这种核心表。
 

群友: 所以要保证顺序消费的话,那其实不管用什么,性能都上不去。 所以扣库存这种业务逻辑,本身要保证顺序,只能一个一个消费了?
简哥:那也不是,看业务场景。 有些保证不能超卖,有些无所谓顺序。 有些仓库是卖螺丝的小配件基本都是称重的,他录了数量,但基本不在乎。有些卖手机的,少一台都是问题。
 

群友: ???
简哥:总之就是,看业务,看需求。 要是普通用用不会有什么重复消费之类的情况。顶多就是消费端上个幂等兜底就行了。但是面试官要是问下去,问清楚他们是什么架构什么场景的,针对性的去回答就好了。

四、结语

其实聊到这里的时候,就没几个能接上话了,话题也差不多终结了。 我也不知道他们说得对不对,但我感觉字多的有道理。我下次面试也这么试试。

面试官: 如何解决消息队列重复消费的?

我:正常使用不会重复消费,你怎么用的?代码怎么写的?

面试官: ???

这样想想还挺带感~

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

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

相关文章

Angular-04:指令

① 内置指令1.1 *ngIf 结构指令1.2 [hidden] 属性指令1.3. *ngFor 结构指令1.4 *ngSwitch 结构指令 ② 自定义指令用法 指令是angular操作dom的途径,分为属性指令和结构指令。属性指令:修改元素的外观或行为。使用 [ ] 包裹。结构指令:增加、…

代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量

代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量 一、695. 岛屿的最大面积 题目链接:https://leetcode.cn/problems/max-area-of-island/ 思路:典型的遍历模板题,我采用深度优先,每块岛屿递归遍历的时候计数&…

Python 框架学习 Django篇 (六) ORM关联

像是上一章我们很少会通过页面点击去添加和绑定关系表,更多的时候都是通过django的语法实现,接下来我们做一个案例 django rom是怎么操作外键关系的 创建mode模型表 Django_demo/mgr/models.py # 国家表 class Country(models.Model):name models.Cha…

手把手教你部署Jenkins教程,小白也能学会(多图预警)!

背景 公司的前端、后端构建及部署工作都是人工去做,随着业务扩大,项目迭代速度变快,人员增多,各种问题都暴露出来,将通过一个简单案例分享一下基于Jenkins的前后端自动化工作流搭建的过程,搭建完这套工作流…

如何编辑pdf?推荐福昕高级pdf编辑器

这里写目录标题 安装教程1.双击FoxitPhantomPDF941_L10N_Setup.exe安装2.打开FiX UZ1文件夹 复制plugins文件夹和FoxitPhantomPDF.exe到安装目录中替换3. 双击Express2BusinessFix New.reg导入注册表 如何复制页面如何修改pdf的内容福昕高级pdf编辑器安装包 【Note】学校要求加…

小型洗衣机哪个牌子质量好?家用小洗衣机推荐

随着人们的生活水平的提升,越来越多小伙伴来开始追求更高的生活水平,一些智能化的小家电就被发明出来,而且小型洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多,所以我们对内衣裤的清洗频次会高于普通衣服,…

2022年京东双十一手机数码全品类数据回顾

2023年双十一临近,特此带大家回顾一下去年双十一热门品类的一些战况数据。这一期是京东手机电脑数码。 整体表现来看,2022年双11大促京东手机、电脑、数码类产品并没有想象中的增长状态,无论是电脑中的笔记本、数码中的相机,或者是…

ICC2:分段长tree的流程

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 分段长tree操作起来方法很多,这里提供两种ICC2分段长tree的方法。有需要的可以试试。 1.用原始sdc长一遍tree,找得到要做subtree部分,并预估latency值。 2.把sdc中添加subtree clock,subtree是…

C# ModBus协议(RTU )详细指南

C# ModBus协议RTU 通讯详解 前言 ModBus协议:官方的解释是Modbus协议是一种通信协议,用于在自动化设备之间进行数据传输。它最初是由Modicon公司于1979年开发的,现在已成为工业界的一种通用协议。Modbus协议有多种变体,包括Modbus-RTU、Modbus-TCP和Modbus-ASCII等,其中…

国产 2443A 峰值功率分析仪

2443A 峰值功率分析仪 频率范围覆盖:9kHz至67GHz 产品综述 2443A峰值功率分析仪由峰值功率分析仪主机和系列化峰值功率探头组成,可用于测量和分析微波毫米波脉冲调制信号的多种幅度和时间参数,是表征脉冲调制信号特性的综合性测量与分析仪器。…

矢量图形编辑软件Illustrator 2023 mac中文版软件特点(ai2023) v27.9

illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软…

gitlab查看、修改用户和邮箱,gitlab生成密钥

查看用户、邮箱 git config user.name git config user.email 修改用户、邮箱 git config --global user.name “xxx” git config --global user.email “xxxxxx.com” 生成ssh密钥 ssh-keygen -t rsa -C “xxxxxx.com” 查看SSH秘钥 cat ~/.ssh/id_rsa.pub 将秘钥复制&…

html文字一行时靠右,多行时靠左

html文字一行时靠右&#xff0c;多行时靠左 元素居中 display: block; margin: auto; 文字居中 text-align: center; 文字下划线 text-decoration: underline; 边框线 border: 1px #1D6AF8 double; 圆弧角 border-radius: 10px; <!DOCTYPE html> <html><hea…

【佳学基因检测】如何在WINDOWS中安装E-utilities?

在Windows操作系统中安装和使用NCBI E-utilities需要使用命令行工具&#xff0c;并且通常是通过使用Windows的命令行终端&#xff08;例如&#xff0c;命令提示符或PowerShell&#xff09;来完成的。以下是安装和配置NCBI E-utilities的步骤&#xff1a; 安装Perl&#xff08;…

How to install the console system of i-search rpa on Centos 7

How to install the console system of i-search rpa on Centos 7 1、 准备1.1 、查看磁盘分区状态1.2、上传文件1.2.1、添加上传目录1.2.2、上传安装包1.2.3、解压安装包1.2.4、查看安装包结构 1.3、安装依赖包1.3.1、基础依赖包1.3.2 相关依赖 1.4、关闭防火墙1.5、解除SeLin…

【JAVA学习笔记】47 - 异常,try-catch处理,throw处理

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter12/scr/com/yinhai/exception_ 〇、异常处理的引入 程序出现一个小问题如int num1 10;int num2 0&#xff1b;num1 / num2 > 10 / 0 会抛出错误&#xff0c;但这样不算致命的小问题就…

Python 编写 Flink 应用程序经验记录(Flink1.17.1)

目录 官方API文档 提交作业到集群运行 官方示例 环境 编写一个 Flink Python Table API 程序 执行一个 Flink Python Table API 程序 实例处理Kafka后入库到Mysql 下载依赖 flink-kafka jar 读取kafka数据 写入mysql数据 flink-mysql jar 官方API文档 https://nigh…

Spring Boot Actuator 介绍

Spring Boot Actuator是什么 Spring Boot Actuator 模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP 跟踪等&#xff0c;帮助我们监控和管理Spring Boot 应用。 这个模块是一个采集应用内部信息暴露给外部的模块&…

汇编学习(1)

汇编、CPU架构、指令集、硬编码之间的关系 ● 汇编语言&#xff1a;这是一种低级语言&#xff0c;用于与硬件直接交互。它是由人类可读的机器码或指令组成的&#xff0c;这些指令告诉CPU如何执行特定的任务。每条汇编指令都有一个对应的机器码指令&#xff0c;CPU可以理解和执…

css属性clip-path的使用说明

前言 当ui设计上的图片、div等的形状不是长方形&#xff0c;而是多边形的时候&#xff0c;就可以借助clip-path这个css属性来实现。 clip-path CSS 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示&#xff0c;区域外的隐藏。【from: MDN】 clip-path可以理解为一把剪…