标准答案
- 共享状态适合小范围、低竞争、需要即时读取的场景,但必须定义锁、所有权和生命周期。
- 不可变对象适合配置、快照和跨线程读取,更新时用新对象替换,减少部分锁需求。
- 消息传递适合把工作按队列或业务 Key 串行化,代价是延迟、重复、积压和消息协议治理。
- 选择应看一致性需求、访问模式、故障恢复和是否需要跨进程扩展。
题目解析
共享可变状态的优势是读取和更新直接,代价是锁、可见性、生命周期和故障恢复都由调用方承担。它适合边界小、访问频繁且能明确指定写入者的状态。
不可变对象适合配置、快照和跨线程共享,因为发布后内容不会被原地修改;但每次更新可能产生复制和 GC 成本,需要按对象大小和更新频率评估。
消息传递把共享状态转换成事件和所有权转移,适合按业务 Key 串行化,但会引入重复、乱序、积压和最终一致性。选择模型时要把这些恢复成本算进去。
常见误区
- 误区:不可变对象没有内存成本。改正:不可变性减少数据竞争,但复制、快照和垃圾回收仍可能成为瓶颈。
- 误区:引入消息队列后就不需要幂等。改正:消息可能重复投递或重放,消费者仍需用业务键和状态记录去重。
- 误区:共享状态没有明确写入者。改正:定义所有权、锁边界和更新协议,避免多个路径以不同顺序修改同一状态。