缓存改造
- 增加singlefight,防止缓存穿透,但也不能直接用,如果并发量大,而请求的数据太慢,可能会导致整个系统的请求都超时 singleFight 直接用可能存在的问题 出现上述问题的根本原因是以下两点:
阻塞读:缺少超时控制,难以快速失败; 单并发:虽然达到了控制并发的效果,但是牺牲了成功率;
超时控制 ,用DoChan替代Do,DoChan() 通过 channel 返回结果。因此可以使用 select 语句实现超时控制
降低请求数量: 在一些对可用性要求极高的场景下,往往需要一定的请求饱和度来保证业务的最终成功率。 一次请求还是多次请求,对于下游服务而言并没有太大区别,此时使用 singleflight 只是为了降低请求的数量级,那么使用 Forget() 提高下游请求的并发
多级缓存
- 在redis之前再加一层内存缓存。之前也是直接用了公司那边自己写的缓存框架,就是没有多map分片,如果整个内存的缓存数据的key多的话, 我们都知道,map是不能并发读写的。
根据调研,也是选择了性能相对高的缓存框架,因为之前选择了groupCache这种的,但实际上有很多小对象的缓存,导致gc频繁, 后面也是选择了freecache,来保证性能的平衡
-
支持http协议
-
支持 10K RPS (5k 写,5k 读)
-
cache对象至少保持10分钟
-
相应时间平均 5ms, p99.9 10毫秒, p99.999 400毫秒
-
其它HTTP的一些需求
-
为了满足这些需求,要求开发的cache库要保证:
-
即使有百万的缓存对象也要非常快
-
支持大并发访问
-
一定时间后支持剔除