Files
autumn-recruitment/05.架构/service-governance/配置中心设计_test.md
T

145 lines
6.4 KiB
Markdown
Raw Normal View History

2026-08-09 19:06:40 +08:00
---
tags: [test/review, architecture, arch/microservice, config-center]
create time: 2026-08-09 12:00
---
# 配置中心设计 — 测试题
## 概述
本测试覆盖 Apollo 三级 Namespace 模型、Nacos Config 长轮询推送机制、配置热更新实现原理、版本管理和回滚策略。共 10 道题目(6 选择 + 3 填空 + 1 简答)。
---
## 一、选择题(6道,由浅入深)
> **难度阶梯**: Q1-Q2 基础概念 → Q3-Q4 核心原理 → Q5-Q6 深入应用/边界场景
### Q1(基础)— 考察定义层面
Apollo 的配置模型中,以下哪一层不是三级结构的一部分?
A. Environment(部署环境:dev/test/prod)
B. Application(业务应用)
C. Namespace(配置类型)
D. Tenant(租户)
### Q2(基础)→
Nacos Config 的秒级推送底层使用什么机制?
A. WebSocket 长连接
B. HTTP 长轮询(Long Polling)
C. MQTT 发布/订阅
D. Redis Pub/Sub
### Q3(进阶)— 核心原理
Nacos Config 长轮询的工作原理是什么?
A. 客户端每 5 秒定时发送请求,服务端每次都立即返回
B. 客户端发起请求后服务端将其挂起在 waitList 中,配置变化时写入 notificationId 后返回;如果 30 秒无变更则超时返回
C. 服务端主动通过 WebSocket 向客户端推送变更通知
D. 客户端通过 Redis Pub/Sub 订阅配置变更事件
### Q4(进阶)— 比较/辨析
以下关于 Apollo 和 Nacos Config 的区别描述中,哪个是正确的?
A. Apollo 用长轮询,Nacos 用短轮询
B. Apollo 的 namespace 支持更细粒度的权限控制和审批流,ConfigMap 只支持键值对映射
C. Nacos 不支持灰度发布,只有全量发布
D. Apollo 不支持多环境隔离,需要手动管理
### Q5(深入)— 场景推理
某团队在生产环境中修改了数据库连接串配置,服务重启后出现大量连接失败。从配置中心的角度看,最根本的原因是什么?
A. 使用了长轮询而非 WebSocket
B. 配置变更没有经过审核+灰度流程,直接全量推送到生产环境
C. Nacos 的 namespace 粒度不够细
D. Apollo 的三级结构过于复杂
### Q6(深入)— 源码级/边界场景
Apollo 的回滚操作本质上是怎样的?
A. 将版本号倒退回上一个版本,删除中间版本的所有记录
B. 用当前最新状态 + 差异计算生成一个新版本,保证发布记录单调递增
C. 复制上一个版本的快照作为新版本,不产生新的变更记录
D. 在数据库中将对应行的 version 字段减 1
---
## 二、填空题(3道)
### F1 — 填空1
Apollo 客户端发现配置新版本的默认拉取周期是 _____ 秒。当服务端生成了新的 releaseKey 后,客户端在下一次拉取时发现版本变化即触发热加载。
> **提示**: 回想原文中 Apollo 灰度发布流程的描述。
### F2 — 填空2
Spring Cloud 中使用 `@RefreshScope` 注解的 Bean 在配置变更后会自动生成_____,使得下次调用 getter 时获取的是最新的配置值。
> **提示**: 这个代理技术是 Spring 框架的核心特性之一,基于 AOP 实现。
### F3 — 填空3
配置热更新最大的风险是配置变更导致服务行为突变。Apollo 的解决方案是"_____+灰度",先让少量实例生效观察指标,再逐步全量。
> **提示**: 两个字的动词,表示一个审核的动作。
---
## 三、简答题(1道)
### S1
面试官问:"为什么 Nacos Config 用长轮询而不是 WebSocket?"请给出你的完整回答,并扩展到以下讨论:
- 长轮询 vs WebSocket 各自的优缺点
- 微服务架构中的中间件链路限制
- 在什么场景下可能考虑 WebSocket
> **答题框架提示**:
> 1. 长轮询的核心优势
> 2. Websocket 的主要劣势(在微服务语境下)
> 3. 混合方案的思考
---
## 参考答案与解析
### 选择题答案
| 题号 | 正确答案 | 解析 |
|------|---------|------|
| Q1 | D | Apollo 的三级结构是 Environment → Application → Cluster → Namespace。Tenant(租户)不是 Apollo 的标准层级——那是多租户 SaaS 平台的概念。 |
| Q2 | B | Nacos Config 使用 HTTP 长轮询实现秒级推送。不是 WebSocket(因为要兼容所有 HTTP 中间件),也不是 MQTT 或 Redis Pub/Sub。 |
| Q3 | B | 长轮询核心:客户端请求挂起到 waitList,配置变化时写 notificationId 后立即返回;30 秒超时防止连接无限期挂起。客户端收到通知后再拉取最新配置。 |
| Q4 | B | A 错:两者都用长轮询;C 错:Nacos 也支持灰度发布和回滚;D 错:Apollo 天然支持多环境隔离(namespace 就是为这个设计的)。 |
| Q5 | B | 直接全量推送错误配置是最危险的——所有实例同时失效。正确做法是先审核进入待发布状态,灰度到少数 IP 验证无误后再全量。 |
| Q6 | B | 回滚的本质不是"倒退版本"而是用当前状态 + 差异生成新版本。这样保证了发布记录永远单调递增(版本号一直增长),不会产生环形依赖。 |
### 填空题答案
| 题号 | 答案 | 解析 |
|------|------|------|
| F1 | `5` | Apollo Client 每 5 秒轮询一次服务端检查是否有新 releaseKey。这是配置热更新的延迟上限(理想情况下一个拉取周期即可感知变更)。 |
| F2 | `代理 Bean` | @RefreshScope 会动态创建代理对象,每次 getter 调用时检查缓存是否过期,若已过期则从配置中心拉取最新值。 |
| F3 | `审核` | "审核+灰度"流程:编辑配置进入审核状态→审核通过发布→灰度规则指定特定 IP 先接收→验证后全量发布。 |
### 简答题参考答案
S1:**参考答案要点**:
1. **长轮询的核心优势**:兼容所有 HTTP 中间件(网关、CDN、负载均衡器)。微服务架构中请求路径上通常有 Spring Cloud Gateway 等 HTTP-only 代理,这些代理不会做 WebSocket 升级,导致连接断开。
2. **WebSocket 的劣势**:全链路需要升级支持,跨 NAT/防火墙困难;运维复杂度显著增加。
3. **各自的缺点**:长轮询的连接保持期间占用服务端内存;WebSocket 需要维护连接池和心跳保活。
4. **WS 的适用场景**:需要毫秒级推送且能控制全链路的内部系统(如实时协作编辑器、游戏服务器)。对外暴露的微服务配置同步场景不适合。
**评分标准**:答出任意 2 个要点即可得满分;完全正确需覆盖全部要点。
## 关联笔记
- [[服务注册与发现]]
- [[限流熔断降级]]