缓存改造

  • 增加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库要保证:

  • 即使有百万的缓存对象也要非常快

  • 支持大并发访问

  • 一定时间后支持剔除

https://colobu.com/2019/11/18/how-is-the-bigcache-is-fast/