0f68a64829
Deploy Examination / deploy (push) Successful in 10s
Subtopics: - distributed-microservice: 45 questions (分布式微服务架构) - message-queue: 45 questions (消息队列) - k8s-observability: 45 questions (K8s与可观测性) - go-java-concurrency: 45 questions (Go/Java并发模型) - database-advanced: 35 questions (数据库进阶) - ai-engineering: 35 questions (AI工程实践) Question types: single_choice, true_false, fill_blank, short_answer, code_reading
156 lines
17 KiB
JSON
156 lines
17 KiB
JSON
{
|
||
"topic": "distributed-microservice",
|
||
"type": "short_answer",
|
||
"schema_version": "1.0.0",
|
||
"generated": "2026-09-09T00:00:00+08:00",
|
||
"questions": [
|
||
{
|
||
"id": "sa-001",
|
||
"type": "short_answer",
|
||
"difficulty": 3,
|
||
"tags": [
|
||
"microservice",
|
||
"service-discovery"
|
||
],
|
||
"question": "请对比 Consul、Nacos、Etcd 和 ZooKeeper 四种服务注册与发现工具,从 CAP 定理的视角分析它们的一致性模型差异,并说明各自的健康检查机制有何不同。",
|
||
"answer": "从 CAP 定理角度:\n1. ZooKeeper 是 CP 系统,基于 ZAB 协议保证强一致性,任何写操作需要过半节点确认(Leader 选举期间不可用),在网络分区时牺牲可用性。\n2. Consul 是 CP 系统,基于 Raft 协议,强一致性写入需 Leader 确认,但支持多数据中心。\n3. Etcd 同样是 CP 系统,基于 Raft 协议,提供线性一致性读写。\n4. Nacos 支持 AP 和 CP 两种模式切换:临时实例(ephemeral)采用 AP 模式(Distro 协议),持久实例采用 CP 模式(Raft),可根据场景灵活选择。\n\n健康检查差异:\n- Consul:支持 HTTP、TCP、gRPC、Script、TTL 多种方式,支持主动和被动健康检查。\n- Nacos:临时实例通过客户端心跳(默认5秒)维持,持久实例通过服务端主动探测(TCP/HTTP/MySQL)。\n- Etcd:本身不提供内建健康检查,需借助外部组件(如 Kubernetes 的 Readiness Probe)。\n- ZooKeeper:基于 Session 和临时节点(Ephemeral Node)机制,客户端断连后临时节点自动删除,类似心跳检测。",
|
||
"keywords": [
|
||
"CP",
|
||
"AP",
|
||
"Raft",
|
||
"ZAB",
|
||
"Distro",
|
||
"心跳",
|
||
"临时节点",
|
||
"健康检查",
|
||
"Raft协议",
|
||
"Nacos双模式"
|
||
],
|
||
"scoring_rubric": "满分10分。CP/AP定理分类正确(3分):ZK/Consul/Etcd为CP、Nacos支持AP+CP各得满分;一致性协议准确(3分):提及Raft/ZAB/Distro;健康检查机制描述(4分):至少描述3种工具的健康检查方式且准确。",
|
||
"explanation": "这道题考察对分布式系统基础理论(CAP)与主流注册中心实现细节的理解。核心区别在于:CP 系统在网络分区时牺牲可用性保证一致性,而 Nacos 的双模式设计是其差异化优势。健康检查机制直接影响服务的上下线时效和故障检测灵敏度,是生产环境中的关键配置项。",
|
||
"source": null,
|
||
"related": []
|
||
},
|
||
{
|
||
"id": "sa-002",
|
||
"type": "short_answer",
|
||
"difficulty": 3,
|
||
"tags": [
|
||
"microservice",
|
||
"load-balancing",
|
||
"rate-limiting"
|
||
],
|
||
"question": "在一个高并发的微服务场景中,某核心接口 QPS 达到 5000,后端部署了 8 个实例。请分别设计负载均衡策略和限流方案,并说明为什么选择这些策略,以及如何处理实例故障时的流量转移。",
|
||
"answer": "负载均衡策略设计:\n1. 采用一致性哈希作为基础策略,以请求参数(如用户ID)作为哈希键,确保同一用户的请求路由到同一实例,提升本地缓存命中率。\n2. 引入虚拟节点解决节点数少时的数据倾斜问题。\n3. 结合加权轮询:根据各实例的实时负载(CPU、内存、RT)动态调整权重,实现柔性负载均衡。\n4. 客户端负载均衡(如 Spring Cloud LoadBalancer/Ribbon)减少网络跳数,服务端负载均衡(如 Nginx/Envoy)便于统一管控。\n\n限流方案设计:\n1. 总入口层:采用滑动窗口计数器(Sentinel),对整个接口设置 6000 QPS 的总限流阈值(留 20% 余量)。\n2. 单实例:每个实例分配 750 QPS 的令牌桶限流(0.2秒预热),应对瞬时突发流量。\n3. 分布式限流:使用 Redis + Lua 脚本实现全局限流,原子操作保证并发安全;或使用 Sentinel 集群限流模式。\n4. 多级限流:网关层(Sentinel/Gateway)粗粒度 + 服务层(RateLimiter)细粒度。\n\n实例故障处理:\n1. 一致性哈希环上故障节点的流量自动顺时针转移到下一个健康节点。\n2. 配合健康检查(3秒超时)快速摘除故障实例。\n3. 限流阈值动态调整:实例数减少时,按比例缩减各实例限流配额,防止过载。",
|
||
"keywords": [
|
||
"一致性哈希",
|
||
"虚拟节点",
|
||
"加权轮询",
|
||
"令牌桶",
|
||
"滑动窗口",
|
||
"Sentinel",
|
||
"Redis+Lua",
|
||
"客户端负载均衡",
|
||
"服务端负载均衡",
|
||
"健康检查"
|
||
],
|
||
"scoring_rubric": "满分12分。负载均衡策略设计合理(4分):一致性哈希+虚拟节点+动态权重至少提及2项;限流方案完整(4分):至少包含全局+单实例两层限流,令牌桶/滑动窗口/Sentinel选其二;故障转移处理(2分):哈希环流量漂移+健康检查摘除;方案合理性说明(2分):有清晰的选型理由。",
|
||
"explanation": "此题综合考察负载均衡与限流的实际工程设计能力。一致性哈希解决会话粘性问题,滑动窗口解决流量精确统计,令牌桶解决突发流量平滑,Sentinel 解决分布式统一管控。故障时的流量自动转移是高可用的关键保障。",
|
||
"source": null,
|
||
"related": []
|
||
},
|
||
{
|
||
"id": "sa-003",
|
||
"type": "short_answer",
|
||
"difficulty": 4,
|
||
"tags": [
|
||
"microservice",
|
||
"circuit-breaker",
|
||
"config-center"
|
||
],
|
||
"question": "请描述 Circuit Breaker(熔断器)模式的三态状态机(Closed、Open、Half-Open)的工作原理和状态流转条件,并对比 Hystrix、Sentinel 和 Resilience4j 三者的核心差异。如果将熔断器与配置中心(如 Nacos/Apollo)结合使用,如何实现熔断参数的动态下发和热更新?",
|
||
"answer": "一、熔断器三态状态机:\n1. Closed(关闭):正常状态,请求正常通过,熔断器持续统计失败率。当失败率超过阈值(如 50%)且在滑动窗口内的请求量达到最小请求数(如 20),状态切换为 Open。\n2. Open(打开):熔断状态,所有请求直接被拒绝(快速失败),返回降级响应(Fallback)。经过设定的超时时间(如 5 秒)后,自动进入 Half-Open。\n3. Half-Open(半开):试探状态,允许有限数量的请求通过。如果这些请求成功率恢复到阈值以上,回到 Closed;如果仍然失败,回到 Open。\n\n二、三者核心差异:\n- Hystrix(Netflix,已停更):基于 RxJava/线程池隔离,默认 10 秒滑动窗口,提供 Hystrix Dashboard 可视化。\n- Resilience4j(替代 Hystrix):基于装饰器模式,轻量级,支持 Circuit Breaker、RateLimiter、Retry、Bulkhead 等模块组合使用,函数式友好,线程开销低。\n- Sentinel(阿里):除了熔断外,还集成了流量控制、系统自适应保护、热点参数限流;支持实时监控 Dashboard 和动态规则推送,与 Spring Cloud / Dubbo 深度集成。\n\n三、与配置中心结合实现热更新:\n1. Nacos 方案:在 Nacos 中创建熔断规则配置(如 JSON 格式的 CircuitBreaker Rule),Sentinel 通过 Nacos DataSource 监听配置变更,实时拉取新规则并生效,无需重启。\n2. Apollo 方案:在 Apollo 配置中心维护熔断参数(失败率阈值、超时窗口等),Resilience4j 或 Sentinel 通过 @ApolloConfigListener 监听变更事件,动态重建 CircuitBreaker 实例。\n3. 核心原理:配置中心提供长轮询/WebSocket 通知机制,客户端监听器收到变更后原子地替换内存中的规则对象,实现秒级热更新。",
|
||
"keywords": [
|
||
"Closed",
|
||
"Open",
|
||
"Half-Open",
|
||
"失败率阈值",
|
||
"滑动窗口",
|
||
"快速失败",
|
||
"Fallback",
|
||
"Hystrix",
|
||
"Sentinel",
|
||
"Resilience4j",
|
||
"Nacos DataSource",
|
||
"ApolloConfigListener",
|
||
"热更新",
|
||
"动态规则推送"
|
||
],
|
||
"scoring_rubric": "满分15分。三态状态机描述完整准确(5分):三态定义各1分、流转条件各0.5分;三者对比准确(5分):各框架核心特征至少提到2点;配置中心热更新方案(5分):Nacos/Apollo至少描述一种完整链路,包含监听机制和生效原理。",
|
||
"explanation": "熔断器是微服务容错的核心机制,三态状态机保证了系统的优雅降级与自动恢复。Hystrix 已停更但概念经典,Sentinel 功能最全面,Resilience4j 最轻量。与配置中心结合实现参数热更新,是生产环境中快速调整容错策略、应对流量突变的关键能力。",
|
||
"source": null,
|
||
"related": []
|
||
},
|
||
{
|
||
"id": "sa-004",
|
||
"type": "short_answer",
|
||
"difficulty": 4,
|
||
"tags": [
|
||
"microservice",
|
||
"idempotent",
|
||
"distributed-lock"
|
||
],
|
||
"question": "在一个电商下单场景中,用户可能因网络重试导致重复提交订单。请设计一个完整的幂等控制方案,并说明如何结合分布式锁(Redis RedLock / ZooKeeper)保证并发下的幂等性。请比较 Redis RedLock 和 ZooKeeper 分布式锁的实现差异,包括锁续期和可重入性支持。",
|
||
"answer": "一、幂等控制方案设计:\n1. 幂等键(Idempotency Key):客户端在请求中携带唯一幂等键(如 UUID),服务端在处理前查询该键是否已存在。若存在则直接返回之前的结果;若不存在则执行业务逻辑并记录。\n2. Token 机制:调用方先调用获取 Token 接口获得一次性令牌,随请求一起提交。服务端在 Redis 中用 Lua 脚本原子性地检查并删除 Token,成功则处理业务,失败则拒绝重复请求。\n3. 去重表(数据库唯一索引):在订单表中设置 request_id UNIQUE 索引,重复插入时数据库抛出异常,应用层捕获后返回已有结果。\n4. 状态机幂等:通过订单状态流转(如 CREATED → PAID → SHIPPED),前置校验当前状态是否允许该操作,防止重复状态变更。\n\n二、与分布式锁结合:\n1. 加锁时机:在幂等键校验通过后、执行核心业务前,对业务主键(如商品ID+用户ID)加分布式锁。\n2. 处理流程:获取锁 → 二次检查幂等标记(Double Check)→ 执行业务 → 写入幂等标记 → 释放锁。\n\n三、Redis RedLock vs ZooKeeper 分布式锁:\n1. Redis RedLock:\n - 实现:基于 Redisson,向 N 个独立 Redis 节点(通常 5 个)依次请求加锁,超过半数(N/2+1)成功且总耗时小于锁有效期则获锁成功。\n - 锁续期:通过 WatchDog 机制(默认30秒),后台线程每10秒自动续期,业务完成后主动释放。\n - 可重入性:支持,基于 Hash 结构记录重入次数,同一线程可多次加锁。\n - 争议:Martin Kleppmann 指出 RedLock 在时钟跳跃等场景下的安全性问题,但实际生产中 Redisson 的 WatchDog 机制已大幅缓解。\n\n2. ZooKeeper 分布式锁:\n - 实现:基于临时顺序节点(Ephemeral Sequential),每个客户端创建 /lock/seq-xxx 节点,只锁定序号最小的节点;后续节点监听前一个节点的删除事件(避免惊群效应)。\n - 锁续期:基于 Session 心跳,客户端定期发送心跳维持 Session,Session 过期则临时节点自动删除,锁自动释放。\n - 可重入性:通过在节点中记录持有者标识(IP+线程ID+重入次数)实现可重入。\n - 优势:CP 保证,数据一致性更强;Session 机制天然支持锁自动释放,安全性高于 Redis。",
|
||
"keywords": [
|
||
"幂等键",
|
||
"Token机制",
|
||
"去重表",
|
||
"唯一索引",
|
||
"状态机",
|
||
"RedLock",
|
||
"WatchDog",
|
||
"可重入",
|
||
"临时顺序节点",
|
||
"Session心跳",
|
||
"Double Check",
|
||
"Lua脚本"
|
||
],
|
||
"scoring_rubric": "满分15分。幂等方案完整(5分):至少描述3种幂等手段且正确;分布式锁结合(3分):包含加锁+Double Check流程;RedLock描述(4分):半数节点+WatchDog续期+可重入;ZooKeeper描述(3分):临时顺序节点+Session续期+可重入。",
|
||
"explanation": "幂等控制是分布式系统的核心设计要求,尤其在支付、下单等涉及资金操作的场景。分布式锁是实现幂等的手段之一,但需配合幂等键/去重表双重保障。RedLock 追求性能但有一致性争议,ZooKeeper 追求一致性但性能较低,选型需根据业务场景权衡。",
|
||
"source": null,
|
||
"related": []
|
||
},
|
||
{
|
||
"id": "sa-005",
|
||
"type": "short_answer",
|
||
"difficulty": 5,
|
||
"tags": [
|
||
"microservice",
|
||
"distributed-transaction"
|
||
],
|
||
"question": "在一个涉及订单服务、库存服务、支付服务的电商场景中,下单操作需要同时完成:创建订单、扣减库存、发起支付。请对比 2PC、TCC、Saga 和本地消息表四种分布式事务方案的原理、优缺点,并说明你会选择哪种方案以及理由。",
|
||
"answer": "一、四种方案对比:\n\n1. 2PC(两阶段提交):\n - 原理:协调者(TM)向所有参与者(RM)发送 Prepare 请求,参与者执行本地事务但不提交并回复 Ready/Abort;若全部 Ready,则发送 Commit,否则发送 Rollback。\n - 优点:强一致性,数据可靠。\n - 缺点:同步阻塞(Prepare 后资源锁定)、协调者单点故障、数据不一致风险(Commit 阶段部分参与者提交失败)、性能差(不适合高并发)。\n\n2. TCC(Try-Confirm-Cancel):\n - 原理:Try 阶段预留资源(如冻结库存、冻结金额);Confirm 阶段确认提交(扣减冻结资源);Cancel 阶段回滚释放冻结资源。需要为每个操作实现三个接口。\n - 优点:不依赖数据库锁,性能优于 2PC;业务层控制,灵活度高。\n - 缺点:开发成本高(每个服务三个接口);Try 失败时需处理悬挂(空回滚)和幂等问题;资源锁定时间长。\n\n3. Saga:\n - 原理:将长事务拆分为一系列本地事务 T1→T2→T3...,每个 Ti 有对应的补偿事务 Ci。正向执行:T1→T2→T3;若 T3 失败,则逆向补偿:C2→C1。可通过编排(Orchestration)或协同(Choreography)模式实现。\n - 优点:无资源锁定,性能好;适合长流程业务。\n - 缺点:最终一致性,中间状态可能可见;补偿逻辑复杂(如补偿操作本身失败);缺乏隔离性(需要通过语义锁等方式补偿)。\n\n4. 本地消息表:\n - 原理:在订单服务本地事务中,同时写入业务数据和消息表(同一数据库事务保证原子性)。后台定时任务扫描消息表,将消息发送到 MQ,下游消费者处理后回调确认。消息表可定期清理。\n - 优点:实现简单,不依赖特殊中间件;利用数据库事务保证一致性;可靠投递。\n - 缺点:引入消息轮询的性能开销;消息表数据量大时需要分库分表;与业务耦合(消息表结构随业务变化)。\n\n二、方案选择:\n选择 Saga + 本地消息表的组合方案。理由:\n1. 电商下单是典型的长流程业务,涉及多个微服务调用,不适合 2PC 的同步阻塞模型。\n2. Saga 编排模式(如使用 Seata 的 Saga 模式或 Temporal)可以清晰定义正向流程和补偿流程,流程可视化,便于排查问题。\n3. 订单创建和库存扣减使用本地消息表保证最终一致性,支付结果通过回调确认。\n4. 对于库存扣减的中间状态可见问题,可在查询时通过订单状态过滤未完成的事务。\n5. TCC 开发成本过高,电商场景更看重交付速度和性能,不值得投入每个服务三个接口的开发量。",
|
||
"keywords": [
|
||
"2PC",
|
||
"TCC",
|
||
"Saga",
|
||
"本地消息表",
|
||
"最终一致性",
|
||
"补偿事务",
|
||
"Try-Confirm-Cancel",
|
||
"编排模式",
|
||
"协同模式",
|
||
"悬挂",
|
||
"空回滚",
|
||
"语义锁",
|
||
"Seata",
|
||
"中间状态"
|
||
],
|
||
"scoring_rubric": "满分18分。四种方案原理描述各2分(8分):每种方案至少正确描述核心流程;优缺点对比各1分(4分):每种至少提到一个优点和一个缺点;方案选择有理有据(4分):选择合理且理由充分,至少从性能/一致性/开发成本三个维度论证;补充中间状态处理方案(2分):提到语义锁或状态过滤。",
|
||
"explanation": "分布式事务是微服务架构中最复杂的难题之一,核心是在一致性、可用性、性能之间做权衡。2PC 保证强一致但性能差,TCC 灵活但开发成本高,Saga 适合长流程但只有最终一致性,本地消息表简单可靠但引入额外复杂度。实际选型需结合业务场景(实时性要求、并发量、团队能力)综合判断,不存在银弹方案。",
|
||
"source": null,
|
||
"related": []
|
||
}
|
||
]
|
||
} |