使用本地缓存优化微服务

cache in microservice

Posted by ypingcn on January 30, 2022 Lastest updated on January 30, 2022

一 背景

微服务接口在日常维护过程中,都需要根据业务发展情况进行优化。由于业务逻辑中会经常进行信息查询(例如查询用户信息/获取活动配置等),这部分信息的变动并不是很频繁,如果每次都需要走 RPC 调用查询的话,就会多额外的网络请求和资源消耗。特别是在有突发流量的情况下,上游接口调用的暴增会向下传递给下游服务,用户信息等基础信息的查询量会因此而暴增。如果用户信息服务出现瓶颈,上游服务都会不同程度地受到影响从而降低用户体验甚至导致事故。优化可以从这种额外的网络请求和资源消耗做起,使用本地内存缓存取代远程查询进行优化。

二 实际优化

2.1 在用户接入侧进行缓存

在实际业务中,有部分请求都是在获取配置等公用信息。这种对一致性容忍度比较高的接口结果可以在用户接入点侧进行缓存,起到类似于动态 CDN 的效果。缓存需要一个唯一 key 来对不同用户进行区分从而进行缓存,这种唯一 key 可以从多个接口参数值获取,根据一定算法得出。例如地区维度的接口可以将地区代码设置成唯一 key ,相同地区的请求获取相同的配置。这种做法能够得到 20%-80% 的缓存命中率,优化削峰填谷效果明显。

有一个额外的问题是,从接口参数获取唯一 key 的做法无法兼容到需要服务端 ABTest 的场景。 这种情况需要将缓存逻辑继续后置给业务服务处理,而不是在用户接入侧缓存。

2.2 缓存其他微服务接口的结果

可以在内存中缓存相关的接口结果。例如用户信息这种极少变化的接口结果就可以用 LRU 内存缓存下来,如果业务场景可以接受的话,缓存有效期时间可以设置 5 分钟甚至更长时间。而排行榜这种对有效性要求比较高的场景下,设置秒级的有效期更能符合业务需求。

TODO