面试题答案
一键面试基于Node.js的大型分布式微服务系统集成架构设计
一、整体架构概述
- 负载均衡与服务发现:采用 Consul 作为服务发现与配置管理工具,结合 Nginx 或 HAProxy 进行负载均衡。Consul 提供服务注册与发现功能,Nginx/HAProxy 根据 Consul 中注册的服务信息进行请求转发。
- 分布式缓存:使用 Redis Cluster 作为分布式缓存。Redis Cluster 提供高可用、分布式的数据存储,能够应对大量的缓存读写请求。
- 分布式事务管理:引入 Seata 框架来管理分布式事务。Seata 提供 AT、TCC、SAGA 等事务模式,满足不同业务场景的事务需求。
二、组件交互流程
(一)服务注册与发现及负载均衡
- 服务注册
- 每个微服务启动时,向 Consul 进行服务注册,提供自身的服务名称、IP 地址、端口等信息。
- Consul 将这些信息存储在其键值对数据库中。
- 负载均衡器获取服务信息
- Nginx 或 HAProxy 定期从 Consul 获取服务注册信息。
- 负载均衡器根据 Consul 提供的服务列表,更新自身的配置,以便知道可以将请求转发到哪些服务实例。
- 请求转发
- 客户端发送请求到负载均衡器(Nginx/HAProxy)。
- 负载均衡器根据预设的负载均衡算法(如轮询、最少连接数等),从 Consul 提供的服务实例列表中选择一个合适的微服务实例,并将请求转发过去。
(二)分布式缓存交互
- 缓存读取
- 微服务在处理业务逻辑时,首先尝试从 Redis Cluster 中读取数据。
- 如果缓存命中,直接返回数据,减少数据库访问压力。
- 缓存写入
- 当数据发生变化(如新增、更新、删除)时,微服务在更新数据库后,同时更新 Redis Cluster 中的缓存数据,以保证缓存与数据库的一致性。
(三)分布式事务管理交互(以 Seata AT 模式为例)
- 事务开启
- 业务发起方开启一个分布式事务,并向 Seata Server 注册全局事务。
- Seata Server 生成一个全局事务 ID(XID)。
- 分支事务执行
- 业务发起方调用其他微服务参与事务,每个微服务执行本地事务。
- 在执行本地事务前,Seata 的代理数据源会记录数据的原始状态(before image)。
- 本地事务执行完成后,代理数据源记录数据的当前状态(after image)。
- 事务提交/回滚
- 业务发起方完成所有分支事务调用后,根据业务结果向 Seata Server 提交或回滚全局事务。
- Seata Server 根据全局事务状态协调各个分支事务的提交或回滚。如果全局事务提交,各分支事务直接提交;如果全局事务回滚,Seata Server 利用 before image 对各分支事务进行回滚。
三、异常情况处理
(一)负载均衡过程中的网络故障
- 检测机制
- 负载均衡器(Nginx/HAProxy)通过心跳检测机制,定期向微服务实例发送健康检查请求。
- 例如,Nginx 可以配置使用 HTTP、TCP 或 UDP 协议进行健康检查,HAProxy 也有类似的健康检查配置选项。
- 故障处理
- 当某个微服务实例在连续多次健康检查中无响应时,负载均衡器判定该实例所在网络出现故障。
- 负载均衡器将该故障实例从服务列表中暂时移除,不再向其转发请求,以避免请求因网络故障而长时间等待或失败。
- 同时,负载均衡器向运维监控系统发送告警信息,通知运维人员进行网络故障排查与修复。
(二)节点失效
- 服务发现层面
- Consul 采用 gossip 协议进行成员关系管理和故障检测。当某个微服务节点失效时,Consul 通过 gossip 协议在集群内传播节点失效信息。
- 其他 Consul 节点收到该信息后,更新本地的服务注册信息,将失效节点从服务列表中移除。
- 负载均衡层面
- 负载均衡器(Nginx/HAProxy)在获取到 Consul 中更新后的服务列表后,自动将失效节点从自身的转发配置中删除,从而不再向失效节点转发请求。
- 分布式缓存层面
- Redis Cluster 采用主从复制和自动故障转移机制。当某个 Redis 节点失效时,集群中的其他节点会自动检测到,并进行故障转移。
- 从节点会被提升为主节点,继续提供缓存服务。客户端在与 Redis Cluster 交互时,会自动感知到节点的变化并重新连接到新的主节点,保证缓存服务的可用性。
- 分布式事务管理层面
- Seata Server 采用集群部署方式,通过 Raft 协议进行选举和数据同步,保证高可用性。当某个 Seata Server 节点失效时,集群中的其他节点会重新选举出 leader 节点,继续提供事务管理服务。
- 对于正在进行的分布式事务,如果某个参与事务的微服务节点失效,Seata Server 会根据事务状态进行处理。如果该节点已完成分支事务提交且结果为成功,不影响全局事务;如果分支事务未完成或结果为失败,Seata Server 会协调其他节点进行回滚操作,确保数据一致性。