微服务性能优化与架构权衡:缓存、自动伸缩与 CAP 定理解析
缓存的多面应用
在服务交互中,无论是否选择 HTTP 作为服务间协议,客户端缓存以及减少往返客户端的需求都非常有价值。了解如何向客户端提供提示,帮助其确定缓存时间,是优化的关键。
- 写入缓存
写入缓存虽不如读取缓存常用,但在某些场景下很有意义。例如,使用写后缓存(write-behind cache)时,可先将数据写入本地缓存,之后再刷新到下游数据源(可能是数据的规范源)。这在处理突发写入或同一数据多次写入时很有用,还能作为进一步的性能优化手段。若写后缓存中的缓冲写入具有持久性,即使下游服务不可用,也可将写入请求排队,待服务恢复后再发送。 - 弹性缓存
缓存可用于实现故障恢复能力。客户端缓存可在下游服务不可用时,使用缓存的可能过时的数据。也可使用反向代理提供过时数据。对某些系统而言,提供过时数据比不返回结果要好,但这需要根据实际情况判断。为缓解缓存中无请求数据的问题,可采用定期爬取现有实时网站生成静态版本的技术,在故障时显示该版本。 - 隐藏源服务
正常缓存中,缓存未命中时请求会到源服务获取数据,调用者会阻塞等待结果。若发生大规模缓存未命中(如缓存机器故障),大量请求会冲击源服务。对于提供高可缓存数据的服务,源服务通常只按处理部分流量进行扩展。为保护源服务,可让源服务在需要时异步填充缓存。缓存未命中触发事件通知源服务重新填充缓存,若整个分片消失,可在后台重建缓存。为保持系统稳定,可快速失败原始请求。 - 保持