接口变慢了应该如何排查?导致接口变慢的原因有哪些?回答重点
接口变慢的原因可能非常复杂,涉及到 硬件资源、网络、应用程序代码、数据库 等各个层面。
接口变慢的排查思路
大部分情况下,接口变慢的排查思路按照以下的几点来回答面试官(注意,不要过度发散)
利用服务的监控(目前大部分公司项目都部署在云服务平台上,都会提供基础的监控大屏),或使用监控工具(如 Prometheus + Grafan...
线上 CPU 飙高如何排查?回答重点线上 CPU 飙高是一个比较常见的问题,并且它的排查手段比较流程化,非常适合套在各个项目中,大家按照我下面的思路简单加点细节就可以使用在自己的项目上了。
1)首先确认哪个进程占用 CPU 过高,登录服务器利用 top 命令查看。
top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器...
针对支付宝最近出现的八折优惠事故,说说如何才能避免类似事件的发生?回答重点根据官方回应出现 bug 的原因是运营人员配置错营销模板导致的,即优惠额度和优惠类型都写错了。
实际上,类似的人为错误是难以完全避免的。作为开发人员,我们可以从产品和技术的角度出发,思考如何尽量降低人为失误的发生几率,并通过及时的预警、拦截等机制,在出错后减少资损。
从产品侧思考很多敏感场景我们需要“防呆设计”,例...
怎么分析 JVM 当前的内存占用情况?OOM 后怎么分析?回答重点利用 jstat 监控和分析 JVM 内部的垃圾回收、内存等运行状态。可以用它来查看堆内存、非堆内存等的实时状态。
可以使用 jmap 查看, JVM 堆的详细信息(包括堆的配置、内存使用情况、GC 活动等)。
在发生 OOM 时,可以根据 jmap 得到堆转储文件(建议增加JVM启动参数,-XX:+HeapDumpOnO...
如果发现 Redis 内存溢出了?你会怎么做?请给出排查思路和解决方案回答重点遇到线上问题,第一时间是止损,如果发现 Redis 内存溢出,则应该立即扩容,增加 Redis 实例的内存,保证线上业务正常运行。
然后再排查内存溢出的可能原因:
数据过多: Redis 中存储的数据量过大,超过了可用内存。
数据过期策略失效: 大量的 key 没有设置过期时间,导致内存不断增长。
大对...
两百万个生产者发送消息,仅一个消费者,如何高效设计锁?重点回答1)使用无锁数据结构:可以使用无锁的并发队列,如Java的ConcurrentLinkedQueue,它采用了非阻塞算法,避免了加锁的开销。这样,多个生产者可以并发地将消息添加到队列中,而消费者可以从队列中安全地读取消息。
2)批量操作:生产者可以批量发送消息,减少锁竞争的频率。例如,一个生产者可以先在本地缓存一批消息,然后一次性...
如何在附近 100w 的商户中,快速找到离你最近的 5 家商户?回答重点可以使用 MySQL 或 MongoDB 的空间索引,或者使用 Redis 提供的 Geo 数据结构来存储商户位置的位置信息来实现根据距离的快速查找。
使用空间索引例如 R-tree,它适用于二维空间的树形数据结构,能够高效地进行范围查询和最近邻查询。将商户位置(经纬度)数据按照地理区域组织成树结构,可以快速找到位于用户...
Java 写入文件到磁盘会经历哪些过程?重点回答这个问题虽然主要考察对操作系统缓存、文件系统和磁盘的理解,不过最好在开头再提一下 Java 中的操作,表现出从应用层到底层 DMA 的全方位理解。
第一步:写入文件缓冲区为了提高效率,写入文件都会利用缓冲区,即当写入数据时,数据先被存储到缓冲区,而不是直接写入磁盘。缓冲区的目的是减少磁盘 IO 操作的次数,提高性能。
一般用的是 Buffer...
线上发现 Redis 机器爆了,如何优化?回答重点1)首先需要排查并确定根因通过监控工具(如Prometheus、Grafana等或云上自带的一些监控)查看 Redis 的 CPU、内存、命令执行时间或带宽等指标,确定瓶颈所在。
2)依据根因针对性解决问题如果是内存耗尽,可能需要增加机器的内存量(升配),即临时升配解决线上问题后。
后续再走查代码和了解相关业务,判断有些数据是否有必要都存...
项目上有个导出 excel 场景发现很慢,怎么优化?回答重点1)先定位慢在哪儿?需要定位导出 excel 慢在哪里:
业务逻辑慢?
数据库查询慢?
excel 生成慢?
2)针对性解决慢的问题如果是业务逻辑处理很慢,则需要优化调整逻辑,比如将一些在循环内的多次 RPC 调用,变成一次(或更少)的批量 RPC 调用。
如果是数据库查询慢,则查看 SQL 是都命中索引,是否有额外的排序逻辑等...
项目上需要导入一个几百万数据 excel 文件到数据库中,有哪些注意点?回答重点对于百万数据的导入,一般需要关注三类问题:
1)内存,如果一次性在堆内加载过多的数据,可能会导致内存溢出。2)时间,百万数据插入数据库需要一定的时间,同步调用可能会使得方法超时。3)异常,百万数据中可能会有很多异常的情况,比如格式错误、重复数据等等。
内存是有限的,不能一次性将 excel 内的所有数据都加载到内...
一笔订单,在取消的那一刻用户刚好付款了,怎么办?回答重点这种情况在正常的业务场景中是有可能出现的,因为订单都会有定时取消的逻辑,比如 10 分钟或者 15分钟,而用户刚好卡在这个时间点进行付款,此时就会出现两种情况:
1)用户支付成功,支付回调的那一刻支付单刚好还没取消,而等回调结束,取消支付单的事务提交,支付单取消。此时用户扣款了,但是对应的权益或资产没了。
2)用户支付成功,支付回调...
如果一笔订单,用户在微信和支付宝同时支付,会怎么样?回答重点微信和支付宝都会支付成功,因为支付渠道是第三方系统,它们之间的数据是不相通的,因此无法阻止用户付款。
这样一来同一笔订单,用户就会多付了一笔钱,如何避免这个情况?
思路其实很清晰,不管是支付宝支付还是微信支付,用户支付后三方都会进行回调,这个回调处理逻辑在我们的系统中,因此我们可以在这里控制。
支付单都会有状态机,例如从支付中...
从网关再到各个后端服务,如何设置 RPC 的超时时间,要考虑哪些问题?回答重点首先用户(客户端)的请求是先打到网关,再由网关请求各后端服务,因此需要确保客户端到网络连接的超时时间(通常是 HTTP 请求),需要大于网关调用后端服务(通常是 RPC 请求)的综合时间。
其中又有一些细节需要考虑:
1)网关调用几个服务的方式
网关调用后端需求可以是串行,也可以是并行,例如上面的图中的三个服...
假设有一个 1G 大的 HashMap,此时用户请求过来刚好触发它的扩容,会怎样?让你改造下 HashMap 的实现该怎样优化?回答重点如果刚好触发扩容,那么当前用户请求会被阻塞,因为 HashMap 的底层是基于数组+链表(红黑树)来实现的,一旦它发生扩容,就需要新增一个比之前大 2 倍的数组,然后将元素搬运到新的数组上。
而 1G 的 HashMap 够大,所以扩容需要一定的时间,而扩容...
线上数据库连接池爆满问题排查回答重点如果出现了线上连接池爆满的情况,一般情况需要先“止损”,也就是重启服务。
现在一般都会用云上的服务,会有监控,对应监控能查到历史数据库的情况,包括连接池的占用情况。重启后我们快速分析定位事故反生之前一段时间 SQL 的执行情况,连接池的占用情况。
查看当时是否有大量的突发请求,例如做了运营活动,那么很可能请求数上来会导致数据库压力过大,处理缓慢使得连接池占...
每次进入订单列表页面都会触发全量同步?
本题并不是一个常规的面试题,更多的是给一个排查案例,供大家参考一下排查问题的思路,不涉及什么高深技术(在真实企业级开发环境中,大部分的排查案例都不涉及什么技术,都是一些很意外的小bug)没兴趣的小伙伴可以直接跳过此题,面试题看累的小伙伴可以简单看看,放松下神经!
事情是这样的,今天同事给我反馈了一个问题。
因为我们的应用需要从第三方那边同步订单的...
JDK 序列化问题排查
提供一个线上 JDK 序列化问题排查案例,虽然比较基础,但在我任职的公司中出现过两次,而且是 5 年及以上工作经验的同事写的 bug。供大家参考
新加了个字段,然后发版,上线就发现了报错。
就加了一个字段,怎么就序列化出错了呢?
复现错误简单定义一个 Yes 类,可以看到就三个字段。
简单 new 了一个对象,直接塞入到 redis 中。
可以看到 ...
Spring Cloud Gateway 500 问题排查
提供一个线上 Spring Cloud Gateway 问题排查案例,涉及网关的 500 错误、源码还涉及到 linux node 知识点
线上就开始报警了,一看情况网关报 500 了。。
网关(用的是Spring Cloud Gateway)挂了,岂不是所有请求都进不来了?
到底怎么回事?
及时处理话不多说,直接重启(及时回复)...
如果没有内存限制,如何快速、安全地将 1000 亿条数据插入到 HashMap 中?回答重点
前置知识,需要先了解 HashMap 的原理
我们分析一下题目的关键点,HashMap、1000 亿条数据、无限制内存、快速、安全地插入。
首先无限制内存就不需要考虑机器或者 JVM 的内存溢出问题,在这个条件下 1000 亿还是 10000 亿都不影响,反正知道数据量很大就对了。
其次 Has...
MySQL 中 如果我 select * from 一个有 1000 万行的表,内存会飙升么?回答重点内存不会飙升。
因为 MySQL 在执行简单 SELECT * FROM 查询时,不会一次性将所有 1000 万行数据加载到内存中,而是通过逐批次处理的方式来控制内存使用。也就是说 MySQL 是边查边发送数据给客户端。
分批的大小与 net_buffer_length 有关,默认 1638...
如何避免用户重复下单(多次下单未支付,占用库存)回答重点
在稀有商品抢购或秒杀场景中,一个用户多次下单未支付可能是恶意锁库存或损坏其他用户的权益,因此需要避免用户重复下单。
1)首先前端需要进行按钮控制
在用户点击“下单”按钮后,可以通过前端控制按钮状态,比如变为“处理中”或“请稍等”,避免用户在等待过程中多次点击按钮,导致重复下单请求发送到后端。但是前端的操作无法完全避免重复请求,因此需...
微服务中远程调用的超时时间应该设置为多少合适?回答重点一般远程调用的默认超时时间为 2-5s。但在实际工作中,还是要看具体的业务场景,因为不同的业务场景对超时时间的要求不同。
一些查询、验证等较为简单的操作,超时时间可以适当缩短。
一些需要长时间处理的业务,比如大数据处理、复杂的查询,可能需要配置较长的超时时间,避免超时过早导致的失败。
除此之外,超时时间应该基于服务的响应能力进行设置,...
线上消息队列故障,兜底改造方案线上部分接口频繁报错,经排查是因为消息发送超时导致的。我们用的是阿里云的 RocketMQ,去询问客服发现是因为云厂商升级故障使得消息发送频繁超时。
当时没有办法兜底方案处理消息队列故障的场景,后面复盘这部分功能,让我做一定的重构改造。
涉及的业务简单概括:需要在一个 service 方法里执行一些业务,修改了一些数据落库,然后再发送一条 MQ 消息,触发下一个...
让你设计一个文件上传系统,怎么设计?这种题目都是开放性的,面试过程中也不奢望聊出所有的设计细节,仅仅需要抛出一些大致的设计需求与要点,然后简单的方案实现思路即可。
关于文件上传系统有几个最主要的核心点需要解决:
1)如何支持超大文件上传2)避免重复文件存储,节省空间3)限流问题
大文件上传假设有个 10 G 的文件需要上传,正常情况下是将文件转成流传到后端,如果不做任何处理,前端一直传,后端...
让你设计一个分布式 ID 发号器,怎么设计?一般在分库分表场景,就会有分布式 ID 的需求,因为需要有一个唯一标识来标记一个订单或者其他类似的数据等。
全局唯一 ID 有很多种实现,例如 UUID ,优势就是本地生成,很简单。但它是无序的,如果需要将唯一 ID 作为主键,则 UUID 不合适,首先是太长了,其次无序插入会导致数据页频繁分裂,性能不好。
在回答这个面试题的时候可以先提下 UUI...
让你设计一个线程池,怎么设计?这种设计类问题还是一样,先说下理解,表明你是知道这个东西的用处和原理的,然后开始 阐述。
基本上就是按照现有的设计来说,再添加一些个人见解。
线程池讲白了就是存储线程的一个容器,池内保存之前建立过的线程来重复执行任务,减少创建和销毁线程的开销,提高任务的响应速度,并便于线程的管理。
我个人觉得如果要设计一个线程池的话得考虑池内工作线程的管理、任务编排执行、线程池...
让你设计一个 HashMap ,怎么设计?这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash函数、如何处理冲突、如何扩容。
可以先说下你对 HashMap 的理解。
比如:HashMap 无非就是一个存储 <key,value> 格式的集合,用于通过 key 就能快速查找到 value。
基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过...
即时通讯项目中怎么实现历史消息的下拉分页加载?业务场景一般在即时通讯项目(比如聊天室)中,我们会采用下拉分页的方式让用户加载历史消息记录。
区别于标准分页每次只展示当前页面的数据,下拉分页加载是 增量加载 的模式,每次下拉时会请求加载一小部分新数据,并放到已加载的数据列表中,从而形成无限滚动的效果,确保用户体验流畅。
比如用户有 10 条消息记录,以 5 条为单位进行分页,刚进入房间时只会加...
让你设计一个消息队列,怎么设计?设计类题目要先从大局上讲出需要设计的东西的重点,然后再等待面试官的继续提问,深挖。
回答:
首先我们需要明确地提出消息中间件的几个重要角色,分别是生产者、消费者、Broker、注册中心。
简述下消息中间件数据流转过程,无非就是生产者生成消息,发送至 Broker,Broker 可以暂缓消息,然后消费者再从 Broker 获取消息,用于消费。
而注册中心用于服务...