一笔订单,在取消的那一刻用户刚好付款了,怎么办?回答重点这种情况在正常的业务场景中是有可能出现的,因为订单都会有定时取消的逻辑,比如 10 分钟或者 15分钟,而用户刚好卡在这个时间点进行付款,此时就会出现两种情况:
1)用户支付成功,支付回调的那一刻支付单刚好还没取消,而等回调结束,取消支付单的事务提交,支付单取消。此时用户扣款了,但是对应的权益或资产没了。
2)用户支付成功,支付回调...
假设有一个 1G 大的 HashMap,此时用户请求过来刚好触发它的扩容,会怎样?让你改造下 HashMap 的实现该怎样优化?回答重点如果刚好触发扩容,那么当前用户请求会被阻塞,因为 HashMap 的底层是基于数组+链表(红黑树)来实现的,一旦它发生扩容,就需要新增一个比之前大 2 倍的数组,然后将元素搬运到新的数组上。
而 1G 的 HashMap 够大,所以扩容需要一定的时间,而扩容...
从网关再到各个后端服务,如何设置 RPC 的超时时间,要考虑哪些问题?回答重点首先用户(客户端)的请求是先打到网关,再由网关请求各后端服务,因此需要确保客户端到网络连接的超时时间(通常是 HTTP 请求),需要大于网关调用后端服务(通常是 RPC 请求)的综合时间。
其中又有一些细节需要考虑:
1)网关调用几个服务的方式
网关调用后端需求可以是串行,也可以是并行,例如上面的图中的三个服...
每次进入订单列表页面都会触发全量同步?
本题并不是一个常规的面试题,更多的是给一个排查案例,供大家参考一下排查问题的思路,不涉及什么高深技术(在真实企业级开发环境中,大部分的排查案例都不涉及什么技术,都是一些很意外的小bug)没兴趣的小伙伴可以直接跳过此题,面试题看累的小伙伴可以简单看看,放松下神经!
事情是这样的,今天同事给我反馈了一个问题。
因为我们的应用需要从第三方那边同步订单的...
线上数据库连接池爆满问题排查回答重点如果出现了线上连接池爆满的情况,一般情况需要先“止损”,也就是重启服务。
现在一般都会用云上的服务,会有监控,对应监控能查到历史数据库的情况,包括连接池的占用情况。重启后我们快速分析定位事故反生之前一段时间 SQL 的执行情况,连接池的占用情况。
查看当时是否有大量的突发请求,例如做了运营活动,那么很可能请求数上来会导致数据库压力过大,处理缓慢使得连接池占...
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 消息,触发下一个...
为什么需要服务注册发现?回答重点在分布式系统中,服务的数量通常会有很多,而且规模还不是一般地大,与此同时,服务的部署和变化也会很频繁。因此,如果要依赖人工去维护这些服务的关系,实现服务的管理以及调用就会变得非常困难。
服务注册与发现的作用就是为了解决这个问题,它通过注册中心来维护服务生产者以及服务消费者之间的关系。当服务启动之后,其就会向注册中心注册自己的信息,比如服务名称、服务端口、服务的...
什么是配置中心?有哪些常见的配置中心?回答重点配置中心是一个用于配置集中化管理且支持动态更新、分发配置文件的工具(服务)。
它实现了配置的统一管理和动态刷新。当配置信息发生变化时,配置中心可以自动通知服务实例进行配置更新,这样就可以实例无需重启即可应用最新的配置,从一定程度上减少了系统访问的空窗期,非常灵活方便。
常见的配置中心:
Spring Cloud Config:Spring 提...
为什么需要在微服务中使用链路追踪?Spring Cloud 可以选择哪些微服务链路追踪方案?回答重点在微服务系统中,少则五六个服务,多则上百个服务,如果某个环节出现问题了,一次调用可能涉及到很多服务,如果服务之间的日志没有关联,那么排查起来非常困难,这个时候就需要链路追踪。
链路追踪可以可视化地追踪请求从一个微服务到另一个微服务的调用情况,从而帮助问题的排查。另外一个方面就是链路追踪还可以帮...
你知道 Nacos 配置中心的实现原理吗?回答重点Nacos 配置中心的实现原理可以分为以下几个核心部分:
1)配置的存储:
企业内 Nacos 一般会使用数据库(如 MySQL)来存储配置数据。配置数据是以键值对的形式存储的,每个配置项对应一个数据 ID(Data ID),并且支持通过 Namespace(命名空间)、Group(组)来进行配置的隔离与分类。
配置存储层在 Nacos 集...
Spring Cloud 的优缺点有哪些?回答重点Spring Cloud 的优点是:集成度高、生态丰富、可扩展性强、功能全面。
Spring Cloud 的缺点是:学习曲线陡峭、有一定的性能开销、组件迭代快版本多、管理复杂。
扩展知识优点细化
集成度高:Spring Cloud 集成了多个成熟的微服务组件(如 Eureka、Zuul、Ribbon、Hystrix、Sleuth 等),与 S...
Spring Cloud 由什么组成?回答重点Spring Cloud 主要由四部分组成:
一、服务注册与发现
1)Eureka 服务注册中心:Eureka 作为服务注册中心,允许服务实例动态加入或离开集群。其他服务可以通过Eureka服务器查询可用的服务实例,并进行负载均衡和故障转移。
2)Consul 服务发现与配置:提供服务发现和配置管理。
二、负载均衡
1)Ribbon 负载均衡器:...
Spring Boot 和 Spring Cloud 之间的区别?回答重点Spring Boot 是一个用于简化 Spring 应用程序开发的框架。它的主要目标是减少 Spring 应用程序的配置和开发复杂性。
而 Spring Cloud 是基于 Spring Boot 的,因此在使用 Spring Cloud 构建微服务时,必须先使用 Spring Boot 来开发基础的应用。Sprin...
单体应用、SOA、微服务架构有什么区别?回答重点单体应用、SOA 和微服务架构都是不同的架构风格,适用于不同的情况:
单体应用,其对外是一个整体,所有的功能都打包在同一个应用上。这种架构风格方便测试和容易部署,不过有一个点,当发生故障的时候可能会导致服务整体不可用,容易发生单点故障,所以灵活性和可维护性并不是很高。
SOA 是一种面向服务的架构风格,将系统划分为多个独立的服务。这些服务可以...
Spring Cloud Config 是什么?回答重点Spring Cloud Config 为分布式系统外部化配置提供了服务端以及客户端的支持,简单来说就是一个配置中心,其主要包括以下两个部分的内容:Config Server(Config 服务端)和 Config Client(Config 客户端)。
Config Server 是一个可横向扩展,并且集中式配置的服务器,主要用于集...
你是怎么理解微服务的?回答重点微服务(Micreoservies)是一种软件架构风格,它的主要目的就是将一个复杂应用程序拆分成多个职责单一的服务。
微服务的核心思想是“单一职责原则”,即每个服务专注于完成一个特定的任务,确保服务的高内聚性和低耦合性。
这会使得开发、部署、维护更加灵活和高效。针对不同服务可以进行不同技术或者语言选型,比如机器学习可以用 Python、一些嵌入式可以用 c++、...
你们的服务是怎么做日志收集的?回答重点我们服务采用的方案是 ELK 那套,Logstash 主要负责从微服务集群采集日志,然后将日志数据发送到 ElasticSearch,ES 主要负责数据的存储和检索,最后 Kibana 就负责日志数据的可视化分析。
流程如下图所示:
ElasticSearch: ElasticSearch 是一个分布式搜索和分析引擎,可以存储和索引大量的日志数据...
说一下你对于 DDD 的了解?回答重点DDD 全名叫做 Domain-driven design,即领域驱动设计,它是一种软件开发方法,其主要目的就是让开发人员和领域专家可以更好地协作,从而开发出满足业务需求的系统。
DDD 的关键概念包括领域模型和限界上下文。
领域模型描述了业务领域的规则和逻辑,让开发人员能够更好地理解业务需求。
限界上下文则定义了一个特定的业务领域内的模型和代码,使得...
什么是 Seata?回答重点Seata(Simple Extensible Autonomous Transaction Architecture) 是阿里巴巴开源的一款分布式事务解决方案。
其主要是为了解决分布式系统中全局事务的一致性问题。Seata 提供了多种事务模式,包括 AT、TCC、Saga 以及 XA 模式。
在 Seata 中有三个很重要的角色:事务协调者(TC)、事务管理者(...
Seata 的事务回滚是怎么实现的?回答重点Seata 一共有四种事务模式,不同模式下回滚策略是不一样的。
AT 模式的回滚机制:在 AT 模式中,Seata 的回滚机制依赖于数据库中的 undo_log 表。每当执行数据库操作(如 INSERT、UPDATE、DELETE)时,Seata 的 RM 会在数据库中记录操作前的数据快照,并存储在 undo_log 中。这个过程在业务操作的本地事...
分布式和微服务有什么区别?回答重点分布式系统和微服务架构是两个相关但不同的概念,它们的注重点其实不太一样。
分布式系统:它是由多台计算机或多节点组成的系统,各节点之间通过网络进行通信和协作,共同完成一个或多个共享的任务。
也就是说分布式的各个节点其实目标是一致的,之所以要分布式只是为了有更好的能力,能更快、更高效地承接任务。
比如常见的分布式文件系统、分布式数据库。
微服务架构:微服务...
了解 Seata 的实现原理吗?回答重点Seata 主要通过三大核心组件来协调全局事务的执行。
事务协调器(Transaction Coordinator,TC):TC 负责管理全局事务的生命周期,记录全局事务和分支事务的状态,并协调全局事务的提交和回滚。TC 是 Seata 的中心控制器,所有的分布式事务请求都会通过 TC 进行管理。
作用:TC 保证各个分支事务在全局事务中的状态一致性...
什么是 Eureka?回答重点Eureka 是一个 Spring Cloud Netflix 的一款老牌注册中心,设计用于实现云端部署微服务架构中的服务注册与发现功能。这个名字来源于古希腊语,意为“我找到了它”,灵感来源于阿基米德的著名发现故事。
在技术领域,特别是分布式系统中,Eureka 作为一个基于 RESTFul 的服务,主要职责包括:
服务注册:允许服务实例向 Eureka Se...
Spring Cloud 有哪些注册中心?回答重点Eureka:是由 Netflix 开源的服务注册与发现框架,属于 Spring Cloud 生态的一部分。
特点:
采用 AP 原则,即强调系统的可用性和分区容忍性,允许短暂的一致性延迟。
易于与 Spring Cloud 集成,提供良好的服务发现能力。
支持 服务注册、心跳检测、服务下线 和 服务剔除。
自我保护机制,在网络出现短暂问题...