POSA 并发/网络对象与分布式模式

共 37 题
📑 题目列表 37 题
#
★★★

1. Forwarder-Receiver、Client-Dispatcher、Server-Activator 在多层网络服务中的组合方式?

请说明 Forwarder-Receiver、Client-Dispatcher、Server-Activator 在多层网络服务中的组合方式?

  • Forwarder-Receiver 模式
  • Client-Dispatcher 模式
  • Server-Activator 模式

POSA 中的网络对象模式用于把"业务逻辑"与"网络通信"分离:

  • Forwarder-Receiver(转发-接收):把通信功能封装为 Forwarder(发送端)与 Receiver(接收端),屏蔽底层 socket 与协议细节,使业务对象不直接处理网络;Forwarder 负责发起与发送,Receiver 负责接收与分发。
  • Client-Dispatcher(客户端-分发器):引入 Dispatcher 作为中间转发者,客户端通过 Dispatcher 定位并调用服务端,Dispatcher 负责服务注册、路由与转发,实现客户端的查找与透明通信。
  • Server-Activator(服务器-激活器):服务端在启动时注册服务,激活器(Activator)在收到请求时按需激活/调度服务实例,实现服务端服务的创建与激活。 组合方式:在多层网络服务中,客户端用 Forwarder 封装发送、经 Dispatcher 找到服务端;服务端用 Server-Activator 激活服务,服务实例用 Receiver 接收请求。三者组合:Client-Dispatcher 负责"客户端到服务端的定位与路由",Forwarder-Receiver 负责"消息的发送与接收/协议转换",Server-Activator 负责"服务端对象的激活与生命周期"。即 Dispatcher 是路由层,Forwarder/Receiver 是通信层,Activator 是服务端激活层,分层组合实现"关注点分离"的分布式通信。

这三个模式分别解决"客户端发现服务端(Dispatcher)、消息收发(Forwarder/Receiver)、服务端激活(Activator)",组合起来覆盖分布式通信的完整链路,强调把网络与业务分离。

#
★★★

2. Leader/Followers 模式的线程角色(leader/follower/processing)、handoffs 与避免共享队列的扩展性?

请说明 Leader/Followers 模式中的线程角色(leader/follower/processing)、handoffs 机制,以及如何通过避免共享队列提升扩展性?

  • Leader/Followers 线程角色
  • handoffs
  • 避免共享队列

Leader/Followers 模式是一种高并发事件处理模型,用一组线程轮流处理事件,避免共享队列与锁竞争:

  • 线程角色:leader(领导者)——当前负责等待/监听事件(如 select/accept)的线程;follower(跟随者)——等待成为 leader 的线程;processing(处理者)——正处理事件的线程。
  • 工作流程:leader 线程等待事件;事件到达后,leader 从 follower 中选出一个新 leader(让新 leader 继续监听),自己转为 processing 处理事件;处理完成后(可选)转为 follower 回到池中。通过"角色轮换"避免单个线程同时做监听与处理。
  • handoffs(交接):leader 在拿到事件后把"领导权"交接给下一个 follower,实现监听与处理的分工,无需共享队列。
  • 避免共享队列:相比 Half-Sync/Half-Async 用共享队列传递事件,Leader/Followers 直接把事件交给处理线程,避免共享队列的锁竞争与上下文切换,提升扩展性(无队列瓶颈),但要求事件处理线程固定、无缓冲。

Leader/Followers 通过"leader 监听、follower 轮换、processing 处理"的角色切换,handoffs 交接领导权,避免共享队列,降低锁竞争与上下文切换,提升并发扩展性。代价是缺乏缓冲与灵活性。

#
★★★

3. Strangler Fig Pattern 的逐步替换、路由代理、双跑切换如何降低遗留系统迁移风险?

请说明 Strangler Fig(绞杀藤)模式的逐步替换、路由代理、双跑切换如何降低遗留系统迁移风险?

  • Strangler Fig 思想
  • 路由代理
  • 双跑切换

Strangler Fig(绞杀藤/绞杀者)模式借鉴藤蔓渐渐绞杀宿主树:逐步用新系统替换遗留系统,而不是一次性重写。核心手段:

  • 逐步替换:把遗留系统按功能/模块逐个替换为新系统,新老系统并存,逐步绞杀旧系统,最终完全替换。
  • 路由代理:在入口设置路由代理(如 API 网关/反向代理),按路由规则把请求分流到新系统或遗留系统,实现渐进切换(部分功能走新系统,其余走旧系统)。
  • 双跑切换(Paralle Run / shadow):新旧系统并行运行(双跑),把请求同时发给新旧系统,对比结果验证新系统正确性;确认新系统可靠后,把流量正式切换到新系统。降低风险。
  • 降低迁移风险:渐进式(不必一次性重写)、可回滚(路由切换可回退)、可验证(双跑对比)、业务连续性(不影响在线业务)。配合契约测试、影子流量、Feature Flag 与回滚开关。

Strangler Fig 用"渐进替换 + 路由分流 + 双跑验证"降低迁移风险,避免一次性重写的高风险。核心是"共存、分流、验证、切换、回滚"。

#
★★★

4. 为什么 POSA 3 强调“模式之间的桥接”,请举一个跨卷组合实例?

请说明 POSA 3 强调"模式之间的桥接"的原因,并举例一个跨卷组合实例?

  • 模式间桥接
  • 跨卷组合
  • 实例

POSA 3(分布式资源管理模式)强调"模式之间的桥接",因为现实架构很少用一个模式解决所有问题,而是多个模式组合协同;模式之间需要桥接(衔接、协调),才能构成完整方案。若只套用孤立模式,会导致模式间冲突或不完整。跨卷组合实例:例如把"Broker 模式(卷1,分布式通信)"、"Forwarder-Receiver(卷2,网络对象)"与"Half-Sync/Half-Async(卷2,并发)"桥接——Broker 负责分布式对象通信,内部用 Forwarder/Receiver 封装网络收发,用 Half-Sync/Half-Async 的异步层处理并发 I/O,用 Active Object 解耦调用。另一个实例:把"Leader/Followers(卷2)"与"Acceptor-Connector(卷2)"桥接,Acceptor-Connector 负责连接建立与业务处理解耦,Leader/Followers 处理并发事件。桥接的意义在于:模式间通过接口/边界衔接,形成"模式语言",解决组合时的职责划分与冲突。

POSA 3 强调模式桥接,因为架构是"模式语言"而非孤立模式;模式间需通过接口、边界、协调层衔接,组合成完整方案。跨卷组合实例显示模式间的协同与职责划分。

#
★★

5. Acceptor-Connector 模式中网络服务中连接建立与业务处理的解耦设计?

请说明 Acceptor-Connector 模式在网络服务中连接建立与业务处理解耦的设计?

  • Acceptor-Connector 定义
  • 连接建立与业务解耦
  • 设计

Acceptor-Connector 模式(接受器-连接器)把网络服务的"连接建立"与"连接上的业务处理"解耦,使连接管理独立于业务逻辑。组成:

  • Acceptor(接受器):被动监听并接受客户端的连接请求,把新连接交给 Service Handler,不执行业务。
  • Connector(连接器):客户端主动发起连接,建立连接后交给 Service Handler。
  • Service Handler(服务处理者):处理连接建立后的业务(读写、业务逻辑),是连接上的业务处理器。
  • 解耦:Acceptor/Connector 负责连接生命周期管理(监听、建立、注册 I/O),Service Handler 负责业务处理,两者通过"连接建立后移交"解耦。这样可复用连接管理逻辑、独立演进而非耦合业务。常与事件处理(Reactor/Proactor)结合:连接建立后由事件循环分发到 Service Handler。

Acceptor-Connector 把"连接建立(Acceptor/Connector)"与"业务处理(Service Handler)"分离,连接管理可复用、业务可独立演进。是网络服务框架(如 ACE、Netty 的 Channel/Acceptor)的基础。

#
★★

6. CQRS 的命令/查询分离、读写模型、最终一致与同步策略在中等业务中的实现边界?

请说明 CQRS 的命令/查询分离、读写模型、最终一致与同步策略在中等业务中的实现边界?

  • 命令/查询分离
  • 读写模型
  • 最终一致与同步策略

CQRS 把命令(写)与查询(读)分离为独立的命令模型与查询模型。命令模型关注业务规则、事务与状态变更;查询模型关注高效查询,可反规范化、物化视图、投影。读写模型通过事件同步(命令侧产出事件,查询侧投影更新)。最终一致:读写分离后,读模型通常由事件异步更新,存在最终一致延迟(读可能读到旧数据)。同步策略:同步更新(强一致,同事务)或异步更新(最终一致,事件/消息)。在中等业务中的实现边界:并非所有业务都适合 CQRS——当查询复杂、读写负载差异大、需要独立扩展读模型、或需要针对查询优化时采用;简单 CRUD 用 CQRS 反而增加复杂度(引入事件、投影、最终一致)。边界:核心原则是"写模型保业务规则、读模型保查询效率、事件同步但要接受最终一致";中等业务可只做"读模型分离 + 同步/异步投影",不必引入完整事件溯源。

CQRS 的边界是"读写负载差异大、查询复杂时才值得",用事件投影同步读模型并接受最终一致。简单业务用 CQRS 增加复杂度。核心是权衡读写分离收益与最终一致/同步复杂度。

#
★★

7. Circuit Breaker 的 closed/open/half-open 状态机、滑动窗口与半开探测如何配置防雪崩?

请说明 Circuit Breaker 的 closed/open/half-open 状态机、滑动窗口与半开探测如何配置以防雪崩?

  • 状态机
  • 滑动窗口
  • 半开探测

Circuit Breaker(熔断器)状态机:closed(关闭,正常放行统计失败率)→ open(打开,直接快速失败,冷却)→ half-open(半开,少量探测)→ closed/open。滑动窗口(rolling window):在一个时间窗口内(如 10s)统计最近的请求数、失败率、失败数,基于滑动窗口而非全局累计,避免过时数据;窗口内失败率超过阈值且达到最小请求数则触发 open。半开探测(half-open probe):open 冷却后进入 half-open,放行少量探测请求(如 1 个或小比例),若探测成功则恢复 closed,失败则回到 open。防雪崩配置:设置合理的失败率阈值、最小请求数、滑动窗口大小、冷却时间、半开探测数;超时 + 重试(退避+抖动)+ 限流 + 隔离配合。目标是"失败率触顶快速断开,冷却后试探恢复,避免故障放大与雪崩"。

熔断器用滑动窗口统计失败率、半开探测验证恢复,参数量(阈值、窗口、冷却、探测)决定灵敏度与恢复速度。配置得当可防雪崩,配置过松失灵、过严误伤。

#
★★

8. Half-Sync/Half-Async 模式在网关和消息总线中的同步层/异步层/队列层职责划分?

请说明 Half-Sync/Half-Async 模式在网关和消息总线中同步层/异步层/队列层的职责划分?

  • Half-Sync/Half-Async 三层
  • 同步层/异步层/队列层
  • 网关与消息总线应用

Half-Sync/Half-Async 模式把系统分为三层:

  • 异步层(Async Layer):处理无阻塞的 I/O 与事件(如网络收发、事件循环),高效处理高并发 I/O。
  • 同步层(Sync Layer):处理阻塞的、需要线程调度的业务逻辑(同步服务),可多线程。
  • 队列层(Queue Layer):位于异步层与同步层之间,用队列传递事件/任务,解耦异步 I/O 与同步处理,提供缓冲与调度。 职责划分:异步层负责 I/O 事件获取(高性能),同步层负责业务处理(阻塞、复杂),队列层作为缓冲与解耦,异步层把事件放入队列,同步层从队列取任务处理。在网关模型中:异步层用事件循环(Reactor/Netty)接收请求,经队列交给同步层处理业务,再异步返回;在消息总线中:异步层处理消息收发,队列层缓冲消息,同步层消费处理。优点:异步 I/O 高效 + 同步处理简单,缺点是队列与上下文切换开销。

Half-Sync/Half-Async 用"异步 I/O + 队列缓冲 + 同步处理"分离关注点:异步层管 I/O、队列层解耦缓冲、同步层管业务。网关与消息总线用它兼顾高并发 I/O 与简单同步处理。

#
★★

9. Index Table 模式在二级索引、跨分区查询、异步回填和一致性窗口中的设计?

请说明 Index Table(索引表)模式在二级索引、跨分区查询、异步回填和一致性窗口中的设计?

  • Index Table 模式
  • 二级索引与跨分区查询
  • 异步回填与一致性窗口

Index Table(索引表)模式:为数据存储建立额外的索引表(索引数据),实现按非主键字段的查询(二级索引),尤其用于分区存储(如 NoSQL、分片数据库)中按非分区键查询。二级索引:主表按主键/分区键存储,索引表按被索引字段(如 userId、email)存储,支持按该字段查询,解决"分区存储无法按非分区键高效查询"的问题。跨分区查询:索引表本身分区,通过索引表定位到目标分区/主键,再回主表取数据,避免全表扫描。异步回填:主表更新后,索引表异步更新(通过事件/消息/异步任务),存在延迟窗口(索引与主数据短暂不一致)。一致性窗口:由于异步回填,索引表与主表之间存在一致性窗口(最终一致),查询可能读到旧索引数据;需设计窗口大小、重试、补偿保证最终一致。设计要点:索引表的选择(要索引哪些字段)、回填策略(同步/异步)、一致性权衡(强一致用同步回填,最终一致用异步)。

Index Table 用独立索引表实现二级索引与跨分区查询,异步回填带来一致性窗口(最终一致)。设计核心是索引字段选择、回填方式与一致性权衡。

#
★★

10. Sharding 模式的分片键、rebalancing、热点与跨分片事务如何治理?

请说明 Sharding(分片)模式的分片键、rebalancing(再平衡)、热点与跨分片事务如何治理?

  • 分片键选择
  • rebalancing
  • 热点

Sharding(分片)把数据按分片键分布到多个分片(shard),实现水平扩展。分片键选择:选择高基数、均匀分布、能支撑主要查询的字段(如 userId、orderId),避免选择低基数/有偏字段导致数据倾斜。rebalancing(再平衡):数据增长/分片增减时重新分配数据,保证分片均匀;再平衡需迁移数据,设计要平滑(增量迁移、避免长锁)。热点:分片键分布不均或热点数据导致单分片负载过高(热点分片),治理方法:用更均匀的分片键、加盐(salt)/虚拟节点、热点分片再拆分、缓存热点。跨分片事务:单笔事务涉及多个分片,难以用本地事务保证原子,治理方法:尽量用"单分片事务"(分片键设计让相关数据同分片)、分布式事务(Saga/2PC/Outbox)、避免跨分片强一致、接受最终一致。核心是"分片键均匀 + 再平衡平滑 + 热点治理 + 跨分片事务用分布式事务/避免"。

Sharding 的治理重点是分片键(均匀、支撑查询)、再平衡(平滑迁移)、热点(盐/虚拟节点/缓存)、跨分片事务(Saga/2PC/避免)。分片键是根本,决定扩展与热点。

#
★★

11. Active Object、Monitor Object、Half-Sync/Half-Async 的解耦与吞吐取舍?

请说明 Active Object、Monitor Object、Half-Sync/Half-Async 的解耦与吞吐取舍?

  • Active Object 模式
  • Monitor Object 模式
  • Half-Sync/Half-Async

这三个 POSA 并发模式解决"并发与同步"的不同问题:

  • Active Object(主动对象):把方法调用与执行解耦——调用方通过代理把请求放入队列,由独立线程串行执行,返回 future 结果。解耦了"调用"与"执行",用队列缓冲、异步执行,避免调用方阻塞,但引入队列与调度开销。
  • Monitor Object(监视对象):用"锁 + 条件变量"封装共享对象的并发访问,保证线程安全(互斥 + 条件同步)。解耦"并发控制"与"业务逻辑",但锁竞争影响吞吐。
  • Half-Sync/Half-Async:异步 I/O 层 + 队列 + 同步处理层,解耦 I/O 与业务,兼顾高并发 I/O 与简单处理,但队列与上下文切换有开销。 解耦与吞吐取舍:Active Object 用异步队列解耦调用与执行(吞吐高但延迟/复杂度),Monitor Object 用锁保证线程安全(简单但锁竞争限吞吐),Half-Sync/Half-Async 用队列解耦 I/O 与业务(兼顾但开销)。三者的取舍核心是"解耦程度 vs 并发开销":越解耦(队列、异步)吞吐与灵活性越高,但上下文切换/队列/锁开销越大;越简单(Monitor)实现简单但锁竞争限吞吐。

三者分别用"异步队列(Active Object)、锁+条件(Monitor)、异步I/O+队列(Half-Sync/Half-Async)"解耦并发关注点。取舍是"解耦与吞吐 vs 开销与复杂度"。

#
★★

12. Asynchronous Request-Reply 模式在长任务、状态查询、回调 URL 与消息关联中的实现?

请说明 Asynchronous Request-Reply(异步请求-回复)模式在长任务、状态查询、回调 URL 与消息关联中的实现?

  • 异步请求-回复
  • 长任务处理
  • 状态查询与回调 URL

Asynchronous Request-Reply(异步请求-回复)模式用于处理耗时长的操作:客户端发起请求后不阻塞等待,服务端异步处理后返回结果,避免长任务阻塞客户端。实现:

  • 长任务:服务端接收请求后,把任务放入队列异步处理,立即返回"已受理"(含 task id),任务完成后通知客户端。
  • 状态查询:客户端通过 task id 轮询查询任务状态(/status API),或服务端在完成时通过回调。
  • 回调 URL:客户端在请求中携带回调 URL(callback/notification URL),任务完成后服务端调用回调 URL 通知结果。
  • 消息关联(correlation):用关联 ID(correlation id / task id)把请求与后续响应/回调关联起来,客户端据此匹配结果,避免并发错乱。 典型实现:请求-响应 + 轮询(客户端轮询状态)或 Webhook(回调),可基于消息队列(请求/响应队列,用 correlation id 关联)。优点:客户端不阻塞、可处理长任务;缺点:需额外跟踪状态与回调。

异步请求-回复用"立即确认 + 异步处理 + 状态查询/回调 + 关联 ID"解耦长任务,避免客户端阻塞。核心是关联 ID 匹配请求与结果,以及轮询或回调两种取结果方式。

#
★★

13. Claim Check 模式在大消息、消息体外部存储与一致性链路的设计要点?

请说明 Claim Check(票据检查)模式在大消息、消息体外部存储与一致性链路的设计要点?

  • Claim Check 模式
  • 大消息外部存储
  • 一致性链路

Claim Check(票据检查)模式:当消息体过大时,把消息体(大 payload)存储到外部存储(如对象存储、数据库、共享存储),消息队列中只传一个"引用/票据"(claim check,即指向外部存储的 key/URL),消费者用票据取回消息体。设计要点:

  • 大消息处理:把大消息体放入外部存储,队列只传小引用,避免大消息阻塞/打爆队列(Kafka 单条消息大小限制、RabbitMQ 大消息限制)。
  • 票据(claim check):消息中的引用(如对象存储 key、唯一 ID),消费者凭票据取回消息体。
  • 一致性链路:需保证"消息的票据"与"外部存储的消息体"的一致性——写入消息体与发送消息要协调(先写存储再发消息,或 Outbox 保证),避免消息已发但消息体缺失;消息体需有生命周期管理(清理过期消息体,防止存储泄漏);消费者取回消息体后要正确处理(幂等)。 设计要点:外部存储的可靠性(消息体不丢)、消息与消息体的写入顺序(先写体后发消息)、消息体生命周期(TTL/清理)、幂等与重试。

Claim Check 用"外部存储存大消息体 + 队列传引用"解决大消息问题。关键是一致性链路:先写消息体再发消息、消息体生命周期管理、幂等取回,避免消息体与票据不一致。

#
★★

14. Compute Resource Consolidation 在多租户/批/流任务调度中的资源争用与隔离?

请说明 Compute Resource Consolidation(计算资源整合)模式在多租户/批/流任务调度中的资源争用与隔离?

  • Compute Resource Consolidation 定义
  • 多租户/批/流任务
  • 资源争用与隔离

Compute Resource Consolidation(计算资源整合)模式:把多个工作负载(多租户应用、批处理任务、流处理任务)整合到共享的计算机群/资源池上运行,以提高资源利用率、降低成本(如 Kubernetes 混部、共享集群)。在多租户/批/流任务调度中:

  • 资源争用:多个租户/任务共享 CPU、内存、网络、磁盘,可能互相争用资源,导致性能波动、影响其他任务。
  • 隔离:需要资源隔离(cgroup/namespace、容器配额、资源限额)与调度隔离(公平调度、优先级、配额),保证各租户/任务不互相影响。
  • 调度:批任务(离线、可延迟)与流任务(在线、低延迟)混合调度,需优先级与资源预留,避免批任务抢占流任务资源。
  • 治理:资源配额(Quota)、优先级(Priority)、公平调度(Fair/DRF)、抢占(Preemption)、资源隔离(cgroup)、监控(Resource Usage)。整合带来高利用率,但需处理资源争用与隔离。

Compute Resource Consolidation 用共享资源池提高利用率,但引入多租户/批/流任务的资源争用。治理靠资源配额、优先级、公平调度、隔离(cgroup)与监控,平衡利用与隔离。

#
★★

15. Data Consistency 模式(强/最终/弱)在订单、库存、推荐、社交关系中如何选型?

请说明 Data Consistency 模式(强/最终/弱)在订单、库存、推荐、社交关系中的选型?

  • 强/最终/弱一致
  • 各业务场景选型
  • 权衡

数据一致性分为强一致(读写立即一致)、最终一致(短暂不一致后收敛)、弱一致(不保证一致)。

  • 订单:核心业务、涉及资金与状态,需强一致(或本地事务 + 最终一致补偿),保证订单状态正确。
  • 库存:扣减不能超卖,需强一致/原子操作(扣减用原子条件更新),或高并发下用最终一致 + 预占/补偿。
  • 推荐:可容忍最终/弱一致,延迟更新不影响(推荐结果可稍旧),用最终一致。
  • 社交关系:好友、关注等,可容忍最终一致(稍后可见),用最终一致;但核心操作(加好友)可强一致。 选型原则:涉及资金/交易/状态正确性(订单、库存扣减)用强一致;可容忍读旧(推荐、社交、feed)用最终/弱一致;权衡一致性与可用性/性能(CAP/PACELC)。核心是"按业务对一致性的敏感度选型"。

一致性选型取决于业务对"读旧数据/状态错误"的容忍度:交易、库存强一致,推荐、社交最终一致。核心是权衡一致性与性能/可用性。

#
★★

16. Resource Lifecycle Manager、Lookup、Object Lifetime、Release Pool 模式在资源池与对象回收中的实现?

请说明 Resource Lifecycle Manager、Lookup、Object Lifetime、Release Pool 模式在资源池与对象回收中的实现?

  • 资源生命周期管理
  • Lookup 与对象获取
  • 对象生命周期与释放池

这些 POSA 资源模式用于管理共享资源的生命周期与复用:

  • Resource Lifecycle Manager(资源生命周期管理器):集中管理资源的创建、获取、释放、销毁,规范化资源生命周期(避免资源泄漏)。
  • Lookup(查找):为资源提供查找/定位机制,客户端通过 Lookup 获取资源引用(如 JNDI、服务定位),解耦资源获取与使用。
  • Object Lifetime(对象生命周期):管理对象/资源的生命周期状态(创建、活跃、回收),定义何时创建、何时销毁。
  • Release Pool(释放池/资源池):维护一个资源池(对象池),复用资源(连接、线程、对象),避免频繁创建/销毁,提高性能;资源获取/归还需池化管理。 实现:资源池用池化(复用)减少创建开销,Release Pool 管理借出/归还,Resource Lifecycle Manager 统一生命周期,Lookup 提供获取入口,Object Lifetime 保证正确创建与回收。目标:避免资源泄漏、降低创建开销、提高复用。

这些资源模式共同解决"资源池化与生命周期":Lookup 获取、Lifecycle Manager 管生命周期、Object Lifetime 管状态、Release Pool 池化复用。目的是避免泄漏、降开销、提复用。

#
★★

17. Retry 模式的指数退避、抖动、幂等判定与“最大重试次数”应如何选型?

请说明 Retry 模式的指数退避、抖动、幂等判定与"最大重试次数"应如何选型?

  • 指数退避与抖动
  • 幂等判定
  • 最大重试次数选型

Retry(重试)模式用于处理可恢复的瞬时失败,选型要点:

  • 指数退避:重试间隔按指数增长(避免高频重试),配合抖动(jitter)错开重试时刻,避免重试风暴。
  • 幂等判定:重试前需确认操作幂等(重复执行结果一致),非幂等操作重试会放大副作用;用幂等键/去重保证。判定"是否值得重试"要看错误类型(瞬时错误可重试,永久/业务错误不可重试)。
  • 最大重试次数:设置上限(如 3-5 次),避免无限重试;次数太少降低成功率,太多浪费资源、放大压雪崩;结合退避与熔断,超限进入降级/失败。选型:根据错误可恢复性(瞬时 vs 永久)、延迟预算、下游容忍度、资源成本确定退避基数、重试次数与是否加抖动。

Retry 选型是"何时重试(幂等/瞬时错误)、多久重试(退避+抖动)、重试几次(上限)"。核心是幂等判定 + 指数退避加抖动 + 有限次重试 + 熔断兜底。

#
★★

18. Valet Key 模式在临时凭据、对象存储直传、移动端上传的安全性与生命周期设计?

请说明 Valet Key(代客泊车)模式在临时凭据、对象存储直传、移动端上传时的安全性与生命周期设计?

  • Valet Key 模式
  • 临时凭据与直传
  • 安全性与生命周期

Valet Key(代客泊车)模式:客户端不直接访问受保护资源,而是通过一个临时、受限的凭据(如签名 URL、临时 token、SAS)被"代客"存取资源,避免暴露主密钥。典型场景:对象存储直传(移动端/客户端直接上传/下载到对象存储,如 S3 预签名 URL、Azure SAS),不需要经由后端中转。

  • 临时凭据:签发带权限、有效期、范围限制的临时凭据(预签名 URL),客户端用它直传/直读对象存储。
  • 安全性:临时凭据只授予该资源所需的权限(最小权限)、限定范围(单个对象/容器)、限定有效期、可撤销;不能暴露永久密钥。
  • 生命周期:凭据有有效期(到期即失效),需管理签发与过期;对象存储直传需校验文件大小/类型、用凭据做权限控制。优点:后端不中转数据(省带宽、降延迟)、客户端直传、主密钥不泄露;风险:凭据滥用/泄漏,需限定权限与时效。

Valet Key 用"临时受限凭据"让客户端直传/直读取对象存储,避免后端中转与主密钥暴露。安全核心是最小权限、范围限制、有效期、可撤销。

#

19. Reactor 与 Proactor 模式中事件驱动 I/O 的两种模型在 NIO/Netty 中的应用差异?

请说明 Reactor 与 Proactor 模式,事件驱动 I/O 两种模型在 NIO/Netty 中的应用差异?

  • Reactor 模式
  • Proactor 模式
  • NIO/Netty 应用差异

Reactor 与 Proactor 是事件驱动 I/O 的两种模型,区别在于"谁负责实际 I/O 操作":

  • Reactor(反应器):基于"就绪通知"(readiness)——Reactor 监测 I/O 事件(可读/可写就绪),就绪后由应用/线程同步执行 I/O 操作(读/写)。事件驱动,I/O 操作由业务线程完成,是"同步非阻塞"。Java NIO 的 Selector、Netty 的 EventLoop 采用 Reactor 模型(多路复用 + 事件分发)。
  • Proactor(主动器):基于"完成通知"(completion)——异步 I/O 由内核/操作系统完成,完成后通知应用,应用处理结果,是"异步非阻塞"。I/O 操作由内核完成,应用只处理完成回调。Windows IOCP、AIO 采用 Proactor。 应用差异:Netty 默认用 Reactor(EventLoop 多路复用 NIO,事件驱动、同步非阻塞 I/O);Proactor 用异步 I/O(内核完成 I/O,完成回调),适合异步 I/O 平台(IOCP)。差异核心:Reactor 是"就绪后自己做 I/O",Proactor 是"内核做 I/O 完成后通知"。

Reactor 是就绪通知(同步非阻塞,自己做 I/O),Proactor 是完成通知(异步 I/O,内核做 I/O)。NIO/Netty 用 Reactor,Proactor 用于 IOCP 等异步 I/O。区别在 I/O 由谁执行。

#

20. Thread-Specific Storage 中如何避免线程池中 ThreadLocal 的串扰与内存泄漏?

请说明 Thread-Specific Storage(线程特定存储)模式,如何避免线程池中 ThreadLocal 的串扰与内存泄漏?

  • Thread-Specific Storage
  • ThreadLocal 串扰
  • 内存泄漏

Thread-Specific Storage(线程特定存储)模式:把数据与线程关联,使每个线程访问自己的数据副本(如 ThreadLocal),避免共享与并发同步。在 Java 中即 ThreadLocal。线程池中的问题:

  • 串扰(cross-thread contamination):线程池线程被复用,若线程上残留上一次任务设置的 ThreadLocal 值,新任务可能读到上一个任务的脏数据(数据串扰)。避免:在任务开始/结束时清理 ThreadLocal(finally 中 remove)。
  • 内存泄漏:ThreadLocal 的 key 是弱引用,value 是强引用;若线程长期存活(线程池线程)且 ThreadLocal 值未被 remove,value 无法被回收,造成内存泄漏(ThreadLocal 泄漏)。避免:使用 ThreadLocal 后显式 remove(),或用 try-finally 清理。
  • 实践:线程池中 ThreadLocal 需在任务结束或线程归还时清理;避免把大对象/长生命周期数据放 ThreadLocal;用上下文传递(如 MDC、traceId)时注意清理。核心是"线程池复用导致串扰与泄漏,需显式清理"。

Thread-Specific Storage 用线程关联数据,但线程池复用导致串扰(脏数据)与泄漏(value 未回收)。治理是任务结束/线程归还时 remove,避免大对象长期驻留。

#

21. Ambassador Pattern 在代理外部连接、重试/限流/观测与 Sidecar 的关系?

请说明 Ambassador(特使)模式在代理外部连接、重试/限流/观测中的应用,以及与 Sidecar 的关系?

  • Ambassador 模式
  • 代理外部连接
  • 重试/限流/观测

Ambassador(特使)模式:在应用之外放置一个代理进程(或 sidecar),代表应用与外部服务通信,把"连接管理、重试、超时、限流、认证、观测"等横切关注点从应用逻辑中剥离。代理外部连接:应用通过 Ambassador 访问外部服务(数据库、第三方 API、云服务),Ambassador 统一管理连接、重试、限流、认证。重试/限流/观测:Ambassador 在代理层实现重试(退避)、超时、限流、熔断、日志/监控/追踪(可观测性),应用无需实现。与 Sidecar 的关系:Ambassador 通常以 Sidecar 模式部署(与主容器同 pod 的旁路代理),Sidecar 是"部署形态"(旁路容器),Ambassador 是"功能角色"(代表应用对外)。二者常结合:Ambassador 作为 Sidecar 实现出站/外部访问的代理。区别:Sidecar 强调"部署在旁"(可做入站/出站/日志/安全),Ambassador 强调"对外代表"(重试/限流/观测)。

Ambassador 用进程外代理封装外部连接与横切关注(重试/限流/观测),常以 Sidecar 形态部署。Sidecar 是部署形态,Ambassador 是功能角色,二者结合实现出站代理治理。

#

22. Bulkhead Pattern 的线程池/连接池隔离、超时回退、降级开关如何在微服务中实现?

请说明 Bulkhead 模式的线程池/连接池隔离、超时回退、降级开关如何在微服务中实现?

  • 线程池/连接池隔离
  • 超时回退
  • 降级开关

Bulkhead(舱壁)模式在微服务中实现故障隔离:

  • 线程池/连接池隔离:为每个下游依赖分配独立线程池/连接池,某依赖的线程/连接耗尽不影响其他依赖(如 Hystrix 的线程池隔离、每个 Feign 客户端独立连接池)。
  • 超时回退:为每个依赖设置超时,超时后返回降级结果(fallback),避免阻塞;超时 + 回退(默认值/缓存/降级)。
  • 降级开关:预设降级开关,依赖故障/超时时返回降级响应(缓存、默认值、空结果),保证核心可用。
  • 实现:用线程池隔离保护依赖(独立池 + 超时 + 熔断),用 fallback 提供降级,用配置开关控制降级。Hystrix/Resilience4j 提供线程池/信号量隔离 + 超时 + 熔断 + 降级(fallback)。核心是"依赖隔离 + 超时 + 降级兜底"。

Bulkhead 在微服务中通过独立线程池/连接池隔离依赖,配合超时回退与降级开关,实现"依赖故障不影响其他依赖"。Hystrix/Resilience4j 是典型实现。

#

23. POSA 3 中的 Resource Acquisition Is Initialization 模式在分布式事务中如何被借鉴?

请说明 POSA 3 中的 Resource Acquisition Is Initialization(RAII,资源获取即初始化)模式在分布式事务中如何被借鉴?

  • RAII 思想
  • 分布式事务借鉴
  • 资源生命周期

RAII(Resource Acquisition Is Initialization,资源获取即初始化):把资源(内存、文件、锁、连接)的生命周期绑定到对象生命周期,对象创建时获取资源、对象销毁时自动释放资源(析构),保证资源在异常时也能释放,避免泄漏。在分布式事务/分布式资源中的借鉴:

  • 资源与事务生命周期绑定:把数据库连接、锁、事务的开始/提交/回滚绑定到对象/作用域生命周期,作用域结束时自动提交或回滚,避免资源泄漏与事务未关闭。
  • 补偿/清理:借鉴"自动释放"思想,用 finally/作用域/RAII 化封装来保证事务、锁、连接在异常时自动释放/回滚,类似分布式事务的补偿思想。
  • 例子:用 try-with-resources(Java)或 RAII 类管理连接/锁,异常时自动关闭;Saga 的补偿可类比"逆操作的自动释放"。 借鉴点:RAII 的"资源随作用域自动释放"思想映射到分布式事务,即"事务/资源随作用域自动提交或回滚/补偿",保证异常时资源与事务一致释放。

RAII 的"资源生命周期与对象/作用域绑定、异常自动释放"思想被分布式事务借鉴为"事务/资源随作用域自动提交或回滚/补偿",避免泄漏与未关闭事务。

#

24. Pipes-and-Filters、Choreography vs Orchestration 在微服务编排中的可观测性与事务边界?

请说明 Pipes-and-Filters、Choreography vs Orchestration 在微服务编排中的可观测性与事务边界?

  • Pipes-and-Filters
  • Choreography vs Orchestration
  • 可观测性与事务边界

Pipes-and-Filters(管道-过滤器):把处理流程拆成一系列过滤器(filter),通过管道(pipe)连接,数据流经管道依次被多个过滤器处理,每个过滤器可独立开发、复用、组合。配合 Choreography(编排式,事件驱动、无中心)与 Orchestration(协调式,中心协调器):

  • Pipes-and-Filters 在微服务编排中:把业务处理流程组织为过滤器链,过滤器可独立部署/扩缩容,通过管道(消息/事件)连接。
  • 可观测性:Pipes-and-Filters 的过滤器链怎么追踪?用 traceId 贯穿管道,监控每个过滤器;Choreography 因事件分散、无中心,追踪难(需 traceId 传播 + 事件审计);Orchestration 有中心协调器,流程状态集中、可观测性好。
  • 事务边界:Choreography 无中心,事务边界分散(各服务本地事务 + 补偿),回滚难;Orchestration 中心协调器定义事务边界,便于补偿回滚。Pipes-and-Filters 的管道连接过滤器,事务边界在过滤器内(本地事务),跨过滤器需分布式事务/补偿。 权衡:Orchestration 可观测性好、事务边界清晰但中心耦合;Choreography 解耦但追踪难、事务边界分散;Pipes-and-Filters 提供可复用的过滤器链,但需用 traceId 追踪与明确事务边界。

三者结合:Pipes-and-Filters 组织过滤器链,Choreography 无中心(解耦但难观测/事务分散),Orchestration 有中心(可观测/事务清晰但耦合)。可观测性与事务边界是取舍关键。

#

25. Sidecar Pattern 在服务网格、日志/代理、安全代理与多语言异构中的部署模型?

请说明 Sidecar 模式在服务网格、日志/代理、安全代理与多语言异构中的部署模型?

  • Sidecar 部署模型
  • 服务网格/日志/安全代理
  • 多语言异构

Sidecar(边车)模式:在主应用进程旁部署一个旁路容器/进程,扩展或增强主应用,主应用无需修改。部署模型:

  • 服务网格:Sidecar 作为数据面代理(Envoy),处理服务间流量(mTLS、负载均衡、熔断、可观测性),主应用只管业务。
  • 日志/代理:Sidecar 负责日志采集、转发、轮转(如 Fluentd sidecar),或作为代理(出站/入站代理)。
  • 安全代理:Sidecar 负责安全(TLS、认证、WAF、过滤),主应用不感知安全逻辑。
  • 多语言异构:Sidecar 提供语言无关的能力(因为主应用无需改代码),不同语言的服务(Java、Go、Python)都能用同一套 Sidecar 能力,避免每种语言重复实现 SDK。 部署模型:Sidecar 与主容器同 pod 同生命周期(共享网络命名空间、生命周期),可独立升级、替换。优点:语言无关(多语言异构)、解耦横切关注、独立升级;缺点:资源开销(每 pod 一个 sidecar)、启动顺序。

Sidecar 是旁路增强容器,用于服务网格、日志/安全代理、多语言异构,提供语言无关的统一能力。主应用无需改代码,但增加资源开销与运维复杂度。

#

26. Throttling 模式在网关、用户、租户三层的配额设计与令牌桶/漏桶/滑动窗口选择?

请说明 Throttling(限流)模式在网关、用户、租户三层的配额设计,以及令牌桶/漏桶/滑动窗口的选择?

  • 三层配额
  • 令牌桶/漏桶/滑动窗口
  • 选择

Throttling(限流)模式控制请求速率,防止过载。三层配额设计:

  • 网关层:对整体/入口限流(总 QPS、连接数),保护服务。
  • 用户层:对单个用户限流(每个用户每秒次数),防止单用户滥用。
  • 租户层:对租户限流(每个租户配额),防止某租户独占资源。 三层的配额需叠加(总限流 + 用户限流 + 租户限流),按优先级分配。
  • 令牌桶(Token Bucket):按固定速率添加令牌,桶容量允许突发,适合允许突发的一般限流。
  • 漏桶(Leaky Bucket):按固定速率消费,处理速率恒定,适合需要平滑输出(稳定速率)的场景。
  • 滑动窗口(Sliding Window):按时间窗口统计请求数,更精确地限制,适合对固定窗口内次数有严格限制的场景。 选择:允许突发/平滑速率用令牌桶,需要固定平滑输出用漏桶,需要精确次数限制用滑动窗口/计数器。三层配额配合具体算法,实现按用户/租户/网关的差异化限流。

Throttling 按网关/用户/租户三层配配额,算法上令牌桶允许突发、漏桶平滑、滑动窗口精确计数。选择取决于"是否允许突发""是否需平滑""是否需精确次数"。

#

27. Component Configurator、Reconciliation、Scheduler-Activation 模式在分布式组件生命周期中的作用?

请说明 Component Configurator、Reconciliation、Scheduler-Activation 模式在分布式组件生命周期中的作用?

  • Component Configurator
  • Reconciliation
  • Scheduler-Activation

这些模式管理分布式组件/任务的生命周期:

  • Component Configurator(组件配置器):在运行时动态配置/组装组件(链接、更新、卸载组件),使系统可动态配置而不需重启,管理组件配置与生命周期。
  • Reconciliation(调和/对账):声明期望状态与当前状态,持续比较并调和(把当前状态收敛到期望状态),如 Kubernetes 的 Reconcile 循环(控制器不断把实际状态调整为期望状态),保证系统自愈。
  • Scheduler-Activation(调度-激活):调度器按计划激活/执行任务,激活器负责在运行时激活/管理组件/任务,管理任务的调度与生命周期。 作用:Configurator 管动态配置与组件组装,Reconciliation 管状态收敛与自愈(期望 vs 实际),Scheduler-Activation 管任务调度与激活。三者配合管理分布式组件的"配置、状态调和、调度激活"生命周期。

三者分工:Configurator 动态配置组装、Reconciliation 期望状态收敛(自愈)、Scheduler-Activation 调度激活任务。共同管理分布式组件的生命周期。

#

28. Event Sourcing 的事件流、快照、投影、回放、版本化与 schema 演进如何设计?

请说明 Event Sourcing 的事件流、快照、投影、回放、版本化与 schema 演进如何设计?

  • 事件流与快照
  • 投影与回放
  • 版本化与 schema 演进

Event Sourcing 设计要点:

  • 事件流:事件以追加日志形式存储(不可变、按序),作为事实源。
  • 快照(snapshot):定期保存某时刻状态,减少重放量,重放时从快照 + 之后事件。
  • 投影(projection):读模型订阅事件,投影更新查询表/物化视图。
  • 回放(replay):从事件流重放重建状态,用于恢复、审计、重建读模型。
  • 版本化与 schema 演进:事件 schema 会随业务演进,需向后兼容(新增字段带默认值、保留字段编号、用 Schema Registry 校验),旧事件用旧 schema 解析、新事件用新 schema,重放时需兼容不同版本的事件(用事件类型版本号 + 迁移/升级器)。 设计:事件流不可变 + 快照加速 + 投影读模型 + 回放重建 + schema 版本化演进(向后兼容 + 迁移)。核心是"事件不可变、可重放、可演进"。

Event Sourcing 的关键设计是事件流(事实源)+ 快照(加速)+ 投影(读模型)+ 回放(重建)+ schema 演进(向后兼容 + 版本迁移)。schema 演进是长期可维护的关键。

#

29. Externalized Configuration 在配置中心、版本回滚、灰度与密钥轮换上的工程要点?

请说明 Externalized Configuration(外部配置)模式在配置中心、版本回滚、灰度与密钥轮换上的工程要点?

  • 外部配置
  • 配置中心
  • 版本回滚/灰度/密钥轮换

Externalized Configuration(外部配置)模式:把配置从代码中抽取到外部(配置中心/配置文件/环境变量),使应用在运行时动态读取配置,不改代码即可变更。工程要点:

  • 配置中心:集中管理配置(如 Apollo、Nacos、Consul),支持动态下发、热更新、按环境/集群隔离。
  • 版本回滚:配置有版本管理,变更可回滚到历史版本(配置中心保留历史版本)。
  • 灰度:配置支持灰度发布(按集群/实例/用户逐步下发新配置),先验证后全量。
  • 密钥轮换:密钥等敏感配置存配置中心,支持轮换(定期更换密钥、版本化、不影响运行),配合加密存储与权限控制。 要点:配置与代码分离、集中管理、版本回滚、灰度下发、密钥加密与轮换。避免配置硬编码、敏感信息泄露、无版本管理。

Externalized Configuration 用配置中心集中管理配置,支持动态下发、版本回滚、灰度与密钥轮换。核心是配置与代码解耦、集中管理、可回滚可灰度可轮换。

#

30. Idempotency Key 模式在客户端重试、网关去重、消息去重与跨链路去重的设计?

请说明 Idempotency Key(幂等键)模式在客户端重试、网关去重、消息去重与跨链路去重的设计?

  • Idempotency Key 模式
  • 客户端重试/网关/消息去重
  • 跨链路去重

Idempotency Key(幂等键)模式:用一个唯一键标识一次业务操作,使重复提交(同一键)被识别为同一次操作,返回相同结果,从而幂等。设计:

  • 客户端重试:客户端为每次操作生成幂等键(如 UUID),重试时携带同一键,服务端识别重复返回首次结果。
  • 网关去重:网关在入口用幂等键去重(同一键重复请求拦截),避免重复打到后端。
  • 消息去重:消息用幂等键(消息 ID/业务唯一键)去重,重复消息被跳过(Inbox)。
  • 跨链路去重:幂等键贯穿多个服务/链路(同一操作跨服务传递同一幂等键),各环节用同一键去重,保证整条链路不重复。 设计要点:幂等键生成(UUID/业务唯一键)、与操作绑定、服务端存储幂等键(去重表/缓存)、同一键返回首次结果、跨链路传递同一键。核心是"用唯一键跨重试/网关/消息/链路去重"。

Idempotency Key 用唯一键标识操作,客户端重试、网关去重、消息去重、跨链路去重都基于同一键识别重复。跨链路需传递同一幂等键。

#

31. Leader Election 模式在 etcd/ZooKeeper/Consul 上的租约、心跳、脑裂预防?

请说明 Leader Election(领导选举)模式在 etcd/ZooKeeper/Consul 上的租约、心跳与脑裂预防?

  • Leader Election 模式
  • 租约与心跳
  • 脑裂预防

Leader Election(领导选举)模式:在分布式系统中选出一个节点作为 leader,负责协调/管理,避免多个 leader 冲突。在 etcd/ZooKeeper/Consul 上的实现:

  • 租约(lease):通过租约/临时节点竞标 leader,赢得租约的节点成为 leader,租约有效期限制 leader 任期。
  • 心跳(heartbeat):leader 通过续约(心跳)维持租约,若 leader 失联(无心跳超时),租约过期,其他节点重新选举。
  • 脑裂预防:依靠分布式共识(Raft/ZAB)保证全局只有一个 leader——即使网络分区,只有多数派(quorum)能选出 leader,少数派无法成为 leader,避免脑裂(split-brain,多个 leader 并存)。etcd 用 Raft + lease,ZooKeeper 用 ZAB + 会话/临时节点(顺序节点选主),Consul 用 Raft + 会话(session)。
  • 实现:候选节点创建/续约 leader 租约,得到 leader 的节点定期心跳;leader 故障时租约过期,触发重新选举。协议保证"最多一个 leader"(防脑裂)。

Leader Election 用"租约 + 心跳 + 共识"保证唯一 leader。租约限制任期、心跳维持、共识(多数派)防脑裂,etcd/ZK/Consul 都基于 Raft/ZAB 保证单 leader。

#

32. POSA 2,并发与网络对象模式 在主流实现中的标准做法与典型反模式?

请说明 POSA 2(并发与网络对象模式)在主流实现中的标准做法与典型反模式?

  • POSA 2 标准做法
  • 典型反模式
  • 按场景选择模式(网络用 Reactor、并发用 Active Object 等)

POSA 2 涵盖并发与网络对象模式(Reactor、Proactor、Acceptor-Connector、Active Object、Monitor Object、Half-Sync/Half-Async、Leader/Followers 等)。主流实现中的标准做法:

  • 用事件驱动 + 非阻塞 I/O(Reactor/Netty 的 EventLoop)处理高并发网络,避免线程阻塞。
  • 用连接建立与业务解耦(Acceptor-Connector)分离关注点。
  • 用 Active Object/Monitor Object 管理并发与同步,细分锁粒度。 典型反模式:
  • 阻塞 I/O 处理高并发(线程池耗尽)。
  • 全局锁/粗粒度锁(竞争激烈、吞吐低)。
  • 业务逻辑与网络 I/O 耦合(难以复用与测试)。
  • 死在共享队列上用忙等/无界缓冲(内存泄漏、线程空转)。
  • 线程池使用不当(过大浪费、过小阻塞、ThreadLocal 泄漏)。 标准做法:场景化选择模式(网络用 Reactor、并发用 Active Object/Half-Sync/Half-Async、同步用 Monitor Object),避免反模式(阻塞 I/O、粗粒度锁、耦合)。

POSA 2 标准做法是"事件驱动 + 非阻塞 + 关注点分离 + 合理锁粒度",反模式是"阻塞 I/O、粗粒度锁、网络与业务耦合、线程池滥用"。按场景选模式。

#

33. POSA 3 中分布式与资源管理模式 在主流实现中的标准做法与典型反模式?

请说明 POSA 3(分布式与资源管理模式)在主流实现中的标准做法与典型反模式?

  • POSA 3 标准做法
  • 典型反模式
  • 资源池化与生命周期管理

POSA 3 涵盖分布式与资源管理模式(Broker、Client-Dispatcher、Caching、Resource Pool、Leader Election、Locks、Scheduler、Replication 等)。主流实现中的标准做法:

  • 用统一资源管理(资源池、生命周期管理、缓存)提高资源利用与性能。
  • 用分布式协调(Leader Election、分布式锁、Scheduler)管理分布式资源与一致性。
  • 用复制/分片(Replication、Sharding)提升可用性与扩展性。 典型反模式:
  • 资源泄漏(连接/线程/内存未释放,用 RAII/池化治理)。
  • 锁竞争/死锁(粗粒度锁、锁顺序不一致)。
  • 缓存滥用(缓存穿透/击穿/雪崩、不一致)。
  • 单点(无 Leader 选举/无冗余,单点故障)。
  • 资源争用(无配额/隔离,多租户互相影响)。 标准做法:资源池化 + 生命周期管理 + 分布式协调(锁/选举)+ 缓存 + 复制分片,避免资源泄漏、锁竞争、缓存滥用、单点。

POSA 3 标准做法是"资源池化、生命周期管理、分布式协调(锁/选举)、缓存、复制分片",反模式是"资源泄漏、锁竞争、缓存滥用、单点、资源争用"。

#

34. Pipes-and-Filters、Microkernel 模式在中间件、ESB、内核总线中的设计差异?

请说明 Pipes-and-Filters、Microkernel(微内核)模式在中间件、ESB、内核总线中的设计差异?

  • Pipes-and-Filters
  • Microkernel
  • 中间件/ESB/内核总线应用差异

Pipes-and-Filters(管道-过滤器)与 Microkernel(微内核)是两种架构模式:

  • Pipes-and-Filters:把处理拆成过滤器链,数据经管道流过过滤器,可复用、可组合、可独立替换过滤器。适合流式处理、数据管道(如 ETL、消息处理中间件)。
  • Microkernel(微内核):核心系统提供最小功能(内核),插件通过定义好的接口扩展功能,核心与插件解耦,可扩展、可定制。适合可插拔的中间件、ESB、插件系统。 在中间件/ESB/内核总线中的差异:
  • 中间件/ESB:可用 Pipes-and-Filters 组织消息处理流水线(过滤器处理消息、管道连接),也可用 Microkernel 让核心提供消息路由最小能力、插件扩展(协议转换、路由规则、监控)。
  • 内核总线:Microkernel 模式类似"内核 + 插件"(总线 + 挂载的处理器/驱动),核心总线提供最小通信,插件扩展;Pipes-and-Filters 则在总线上做数据流处理链。 差异:Pipes-and-Filters 强调"处理链/流水线",Microkernel 强调"核心 + 插件扩展"。ESB/中间件常结合两者(总线为核心,过滤器/插件为扩展)。

Pipes-and-Filters 是"处理链"(数据流经过滤器),Microkernel 是"核心 + 插件"(最小核心扩展)。在中间件/ESB 中,总线/核心 + 过滤器或插件扩展,二者结合。

#

35. Publisher/Subscriber 与 Event Sourcing 在最终一致、回放、订阅者容量与版本管理上的取舍?

请说明 Publisher/Subscriber 与 Event Sourcing 在最终一致、回放、订阅者容量与版本管理上的取舍?

  • 发布/订阅与事件溯源
  • 最终一致
  • 回放/订阅者容量/版本管理

Publisher/Subscriber(发布/订阅)与 Event Sourcing(事件溯源)都基于事件,但定位不同:

  • Publisher/Subscriber:事件在系统间传播,订阅者消费事件,事件不一定是事实源(可能投递后即消费),用于解耦与通信。
  • Event Sourcing:事件是事实源(状态由事件派生),强调事件持久、可重放、可追溯。 取舍:
  • 最终一致:两者都支持异步、最终一致(订阅者/读模型异步更新)。
  • 回放:Event Sourcing 天然支持回放(事件持久可重放重建);Publisher/Subscriber 若事件不持久则难以回放,需配合持久化。
  • 订阅者容量:Publisher/Subscriber 需处理订阅者容量(广播给多个订阅者,慢订阅者可能积压/阻塞,需用异步/中间件缓冲);Event Sourcing 的投影也需处理投影滞后。
  • 版本管理:Event Sourcing 事件需 schema 版本管理(事件演进兼容);Publisher/Subscriber 事件格式也需版本管理,但不必像 Event Sourcing 那样严格(事件非事实源)。 取舍:需要事实源、回放、审计用 Event Sourcing;只需要解耦通信用 Publisher/Subscriber。两者都需处理最终一致、订阅者容量(积压)与事件版本。

区别在于"事件是否作为事实源":Event Sourcing 可回放、需严格版本管理;Publisher/Subscriber 偏通信。两者都需处理最终一致、订阅者容量与版本管理。

#

36. Scheduler Agent Supervisor 模式在分布式任务、长时作业、补偿、重试与监控中的角色分工?

请说明 Scheduler Agent Supervisor(调度-代理-监管)模式在分布式任务、长时作业、补偿、重试与监控中的角色分工?

  • Scheduler Agent Supervisor 模式
  • 三个角色
  • 长时作业/补偿/重试/监控

Scheduler Agent Supervisor(调度-代理-监管)模式:把分布式任务调度分为三个角色:

  • Scheduler(调度器):负责任务的调度与执行协调(何时执行、重复执行、调度计划),管理任务状态。
  • Agent(代理):执行任务逻辑,在目标节点上执行具体工作,向 Supervisor 报告状态。
  • Supervisor(监管者):监督任务执行状态,处理失败(重试、补偿、终止),保证任务正确完成。 在分布式任务/长时作业中的分工:
  • 长时作业:Scheduler 调度、Agent 执行长任务、Supervisor 监控进度。
  • 补偿:任务失败时 Supervisor 协调补偿(撤销部分副作用)。
  • 重试:Supervisor 对失败任务重试(指数退避),或重新调度。
  • 监控:Supervisor 监控任务进度/状态,Scheduler 管理调度状态,Agent 报告,形成"调度-执行-监管"闭环。 角色分工:Scheduler 调度、Agent 执行、Supervisor 监管(补偿/重试/监控),三者配合管理分布式任务的完整生命周期。

Scheduler Agent Supervisor 用"调度(Scheduler)+ 执行(Agent)+ 监管(Supervisor)"管理分布式任务,Supervisor 负责补偿、重试与监控,是长时任务可靠执行的关键。

#

37. View Handler、Whole-Part、Master-Slave、Proxy、Publisher-Subscriber 在 POSA 3 中的分布式语义?

请说明 View Handler、Whole-Part、Master-Slave、Proxy、Publisher-Subscriber 在 POSA 3 中的分布式语义?

  • View Handler
  • Whole-Part / Master-Slave / Proxy / Publisher-Subscriber
  • 分布式语义

这些是 POSA 中的结构/分布式模式,各有分布式语义:

  • View Handler(视图处理器):管理视图的创建/更新/导航,与模型解耦(类似 MVC 的视图管理层),在分布式中用于管理跨服务的视图/查询视图。
  • Whole-Part(整体-部分):把整体对象组织为部分对象层次(聚合/组合),在分布式中表示聚合根与子实体的组合语义。
  • Master-Slave(主从):主节点处理写/协调,从节点处理读/备份,保证一致性(复制),分布式语义是"主写从读 + 复制"。
  • Proxy(代理):为对象提供替身/代理,控制访问、远程访问(远程代理),分布式语义是"远程对象代理/访问控制"。
  • Publisher-Subscriber(发布-订阅):事件发布者与订阅者解耦,分布式语义是"事件异步传播/解耦"。 这些模式在分布式中分别体现:视图管理(View Handler)、聚合组合(Whole-Part)、主从复制(Master-Slave)、远程/访问代理(Proxy)、事件解耦(Publisher-Subscriber)。它们共同构成分布式系统的结构与通信语义。

各模式分布式语义:View Handler 管视图、Whole-Part 管聚合组合、Master-Slave 管主从复制、Proxy 管远程/访问代理、Publisher-Subscriber 管事件解耦。是 POSA 分布式结构/通信的基础。