回答重点如果出现了线上连接池爆满的情况,一般情况需要先“止损”,也就是重启服务。
现在一般都会用云上的服务,会有监控,对应监控能查到历史数据库的情况,包括连接池的占用情况。重启后我们快速分析定位事故反生之前一段时间 SQL 的执行情况,连接池的占用情况。
查看当时是否有大量的突发请求,例如做了运营活动,那么很可能请求数上来会导致数据库压力过大,处理缓慢使得连接池占用久导致连接数满了。这种情况...
本题并不是一个常规的面试题,更多的是给一个排查案例,供大家参考一下排查问题的思路,不涉及什么高深技术(在真实企业级开发环境中,大部分的排查案例都不涉及什么技术,都是一些很意外的小bug)没兴趣的小伙伴可以直接跳过此题,面试题看累的小伙伴可以简单看看,放松下神经!
事情是这样的,今天同事给我反馈了一个问题。
因为我们的应用需要从第三方那边同步订单的信息,如果用户有一段时间未进入订单页面...
提供一个线上 JDK 序列化问题排查案例,虽然比较基础,但在我任职的公司中出现过两次,而且是 5 年及以上工作经验的同事写的 bug。供大家参考
新加了个字段,然后发版,上线就发现了报错。
就加了一个字段,怎么就序列化出错了呢?
复现错误简单定义一个 Yes 类,可以看到就三个字段。
简单 new 了一个对象,直接塞入到 redis 中。
可以看到 value 看起来是乱...
提供一个线上 Spring Cloud Gateway 问题排查案例,涉及网关的 500 错误、源码还涉及到 linux node 知识点
线上就开始报警了,一看情况网关报 500 了。。
网关(用的是Spring Cloud Gateway)挂了,岂不是所有请求都进不来了?
到底怎么回事?
及时处理话不多说,直接重启(及时回复)。
然后看起来好了,重启大法!yyds!
问题排查感觉有点...
回答重点
前置知识,需要先了解 HashMap 的原理
我们分析一下题目的关键点,HashMap、1000 亿条数据、无限制内存、快速、安全地插入。
首先无限制内存就不需要考虑机器或者 JVM 的内存溢出问题,在这个条件下 1000 亿还是 10000 亿都不影响,反正知道数据量很大就对了。
其次 HashMap + 插入,需要考虑影响性能的点:
哈希冲突,如果数据哈希冲突很大,都命中...
回答重点内存不会飙升。
因为 MySQL 在执行简单 SELECT * FROM 查询时,不会一次性将所有 1000 万行数据加载到内存中,而是通过逐批次处理的方式来控制内存使用。也就是说 MySQL 是边查边发送数据给客户端。
分批的大小与 net_buffer_length 有关,默认 16384 字节(16 KB)。
所以实际上获取数据和发送数据的流程是这样的:
获取一行,写入到 n...
回答重点
在稀有商品抢购或秒杀场景中,一个用户多次下单未支付可能是恶意锁库存或损坏其他用户的权益,因此需要避免用户重复下单。
1)首先前端需要进行按钮控制
在用户点击“下单”按钮后,可以通过前端控制按钮状态,比如变为“处理中”或“请稍等”,避免用户在等待过程中多次点击按钮,导致重复下单请求发送到后端。但是前端的操作无法完全避免重复请求,因此需要与后端的幂等控制结合,以确保不会因多次点击创建...
线上部分接口频繁报错,经排查是因为消息发送超时导致的。我们用的是阿里云的 RocketMQ,去询问客服发现是因为云厂商升级故障使得消息发送频繁超时。
当时没有办法兜底方案处理消息队列故障的场景,后面复盘这部分功能,让我做一定的重构改造。
涉及的业务简单概括:需要在一个 service 方法里执行一些业务,修改了一些数据落库,然后再发送一条 MQ 消息,触发下一个流程。
因此需要保证当前 se...
回答重点一般远程调用的默认超时时间为 2-5s。但在实际工作中,还是要看具体的业务场景,因为不同的业务场景对超时时间的要求不同。
一些查询、验证等较为简单的操作,超时时间可以适当缩短。
一些需要长时间处理的业务,比如大数据处理、复杂的查询,可能需要配置较长的超时时间,避免超时过早导致的失败。
除此之外,超时时间应该基于服务的响应能力进行设置,也就是考虑服务端(服务提供者)的处理时间,如果...
回答重点在 Spring Cloud 架构中,有很多种可以选择的 API 网关方案,主要如下:
1)Spring Cloud Gateway:这个应该是现在 Spring Cloud 微服务开发中使用比较广泛的,也是 Spring 大力推荐的,其基于非阻塞的 WebFlux 响应式编程框架,充分发挥了响应式编程的优势以及特性,其提供了流量染色、路由转发、流量控制、服务熔断等功能,并且 Spr...
回答重点Spring Cloud Zuul 是 Spring Cloud 官方早期默认推荐的网关组件,不过其由于 2020 年 12 月开始已经停止维护了,其现在逐渐被 Spring Cloud Gateway 所取代。
Zuul 提供了鉴权、路由、限流等功能,可以与 Spring Cloud 的其他组件,比如说 Eureka、Ribbon、Hystrix、Feign 等组件配合实现,实现服...
回答重点Spring Cloud Gateway 是 Spring Cloud 开源的网关组件,其使用了 WebFlux 框架,充分发挥了响应式编程的特性以及优点,其底层使用了 Netty 作为通信框架,并且包含了 Spring framework 5、SpringBoot 2 以及 Project Reactor 等技术,适配 Spring Cloud 生态体系。
在微服务架构中充当着前端...
回答重点选择 Spring Cloud Gateway 的原因主要有两个:
1)以前用得比较多的是 Spring Cloud 官方开源的 Zuul,其用得比较多的还是 1.0 的版本,不过 1.0 版本 Netflix 很早就宣布进入维护状态了,虽然 Zuul 已经出了 2.0 版本,但是 Spring Cloud 官方团队好像没有整合的计划,并且 Netflix 很多相关的组件,如 Eur...
回答重点API 网关是位于客户端与后端服务之间的一层,充当所有客户端请求的统一入口,负责路由请求到正确的服务,并提供认证与授权、负载均衡、限流、缓存、日志记录等功能。
API 网关的作用简化客户端调用:
统一入口:API 网关提供了单一入口,客户端只需与网关交互,而不需要了解后端服务的具体部署位置和接口细节,从而简化了客户端的调用逻辑。
请求聚合:在需要调用多个后端服务时,API 网关可以...
回答重点令牌桶算法是一种流量控制算法,用于限制系统的访问频率。该算法允许以固定的速率向“桶”中加入令牌,处理请求时消耗桶中的令牌。当桶中的令牌耗尽时,后续请求会被拒绝或延迟处理。
在 Java 中可以使用基于 Guava 的 RateLimiter 实现令牌桶算法,可以有效控制单用户的访问频率,避免恶意行为。
令牌桶算法工作原理令牌桶算法的核心思想是通过一个“桶”来控制数据流量的速率:
1)...
回答重点在分布式系统中,服务的数量通常会有很多,而且规模还不是一般地大,与此同时,服务的部署和变化也会很频繁。因此,如果要依赖人工去维护这些服务的关系,实现服务的管理以及调用就会变得非常困难。
服务注册与发现的作用就是为了解决这个问题,它通过注册中心来维护服务生产者以及服务消费者之间的关系。当服务启动之后,其就会向注册中心注册自己的信息,比如服务名称、服务端口、服务的 IP 地址等,当服务消...
回答重点配置中心是一个用于配置集中化管理且支持动态更新、分发配置文件的工具(服务)。
它实现了配置的统一管理和动态刷新。当配置信息发生变化时,配置中心可以自动通知服务实例进行配置更新,这样就可以实例无需重启即可应用最新的配置,从一定程度上减少了系统访问的空窗期,非常灵活方便。
常见的配置中心:
Spring Cloud Config:Spring 提供的分布式配置管理工具,支持从 Git...
回答重点Nacos 配置中心的实现原理可以分为以下几个核心部分:
1)配置的存储:
企业内 Nacos 一般会使用数据库(如 MySQL)来存储配置数据。配置数据是以键值对的形式存储的,每个配置项对应一个数据 ID(Data ID),并且支持通过 Namespace(命名空间)、Group(组)来进行配置的隔离与分类。
配置存储层在 Nacos 集群的任意节点都可以进行读写,通过多副本的数...
回答重点Spring Cloud 的优点是:集成度高、生态丰富、可扩展性强、功能全面。
Spring Cloud 的缺点是:学习曲线陡峭、有一定的性能开销、组件迭代快版本多、管理复杂。
扩展知识优点细化
集成度高:Spring Cloud 集成了多个成熟的微服务组件(如 Eureka、Zuul、Ribbon、Hystrix、Sleuth 等),与 Spring Boot 无缝结合,开发者可以...
回答重点Spring Boot 是一个用于简化 Spring 应用程序开发的框架。它的主要目标是减少 Spring 应用程序的配置和开发复杂性。
而 Spring Cloud 是基于 Spring Boot 的,因此在使用 Spring Cloud 构建微服务时,必须先使用 Spring Boot 来开发基础的应用。Spring Boot 提供的基础功能和自动配置是 Spring Cloud...
回答重点在微服务系统中,少则五六个服务,多则上百个服务,如果某个环节出现问题了,一次调用可能涉及到很多服务,如果服务之间的日志没有关联,那么排查起来非常困难,这个时候就需要链路追踪。
链路追踪可以可视化地追踪请求从一个微服务到另一个微服务的调用情况,从而帮助问题的排查。另外一个方面就是链路追踪还可以帮助优化性能,可视化服务之间的依赖关系,并进行服务的监控与报警。
简单的实现就是在日志中定义一...
回答重点Spring Cloud 主要由四部分组成:
一、服务注册与发现
1)Eureka 服务注册中心:Eureka 作为服务注册中心,允许服务实例动态加入或离开集群。其他服务可以通过Eureka服务器查询可用的服务实例,并进行负载均衡和故障转移。
2)Consul 服务发现与配置:提供服务发现和配置管理。
二、负载均衡
1)Ribbon 负载均衡器:Ribbon 基于 HTTP 和 TC...
回答重点单体应用、SOA 和微服务架构都是不同的架构风格,适用于不同的情况:
单体应用,其对外是一个整体,所有的功能都打包在同一个应用上。这种架构风格方便测试和容易部署,不过有一个点,当发生故障的时候可能会导致服务整体不可用,容易发生单点故障,所以灵活性和可维护性并不是很高。
SOA 是一种面向服务的架构风格,将系统划分为多个独立的服务。这些服务可以通过网络调用,并且可以实现跨平台、跨语言...
回答重点Spring Cloud Config 为分布式系统外部化配置提供了服务端以及客户端的支持,简单来说就是一个配置中心,其主要包括以下两个部分的内容:Config Server(Config 服务端)和 Config Client(Config 客户端)。
Config Server 是一个可横向扩展,并且集中式配置的服务器,主要用于集中管理服务各种环境下的配置,然后默认使用 Git...
回答重点微服务(Micreoservies)是一种软件架构风格,它的主要目的就是将一个复杂应用程序拆分成多个职责单一的服务。
微服务的核心思想是“单一职责原则”,即每个服务专注于完成一个特定的任务,确保服务的高内聚性和低耦合性。
这会使得开发、部署、维护更加灵活和高效。针对不同服务可以进行不同技术或者语言选型,比如机器学习可以用 Python、一些嵌入式可以用 c++、其他可以用 Java ...
回答重点我们服务采用的方案是 ELK 那套,Logstash 主要负责从微服务集群采集日志,然后将日志数据发送到 ElasticSearch,ES 主要负责数据的存储和检索,最后 Kibana 就负责日志数据的可视化分析。
流程如下图所示:
ElasticSearch: ElasticSearch 是一个分布式搜索和分析引擎,可以存储和索引大量的日志数据,他提供了快速的搜索和聚合功能...
回答重点DDD 全名叫做 Domain-driven design,即领域驱动设计,它是一种软件开发方法,其主要目的就是让开发人员和领域专家可以更好地协作,从而开发出满足业务需求的系统。
DDD 的关键概念包括领域模型和限界上下文。
领域模型描述了业务领域的规则和逻辑,让开发人员能够更好地理解业务需求。
限界上下文则定义了一个特定的业务领域内的模型和代码,使得其可以独立于其他上下文进行开发...
回答重点Seata(Simple Extensible Autonomous Transaction Architecture) 是阿里巴巴开源的一款分布式事务解决方案。
其主要是为了解决分布式系统中全局事务的一致性问题。Seata 提供了多种事务模式,包括 AT、TCC、Saga 以及 XA 模式。
在 Seata 中有三个很重要的角色:事务协调者(TC)、事务管理者(TM)以及事务的作业...
回答重点Seata 一共有四种事务模式,不同模式下回滚策略是不一样的。
AT 模式的回滚机制:在 AT 模式中,Seata 的回滚机制依赖于数据库中的 undo_log 表。每当执行数据库操作(如 INSERT、UPDATE、DELETE)时,Seata 的 RM 会在数据库中记录操作前的数据快照,并存储在 undo_log 中。这个过程在业务操作的本地事务提交前完成。
如果全局事务中任一分...
回答重点Seata 主要通过三大核心组件来协调全局事务的执行。
事务协调器(Transaction Coordinator,TC):TC 负责管理全局事务的生命周期,记录全局事务和分支事务的状态,并协调全局事务的提交和回滚。TC 是 Seata 的中心控制器,所有的分布式事务请求都会通过 TC 进行管理。
作用:TC 保证各个分支事务在全局事务中的状态一致性。它记录每个事务分支的状态信息,...