京东的本地热点缓存分析

时间:2021-7-3 作者:qvyue

什么是本地热点缓存?

在高并发场景中,为了提高读取速度,降低对DB层(mysql或者redis)压力,往往需要进行JVM本地缓存。但是对于数据量非常大的情况下时(例如上百万的商品),业务侧无挑剔的全部进行缓存(结合失效策略),可能导致缓存过多的数据,造成内存的浪费。而如果设置缓存数量大小进行限制,缓存的频繁失效导致效果不佳。而京东的hotkey就是为了解决这个问题。

看下架构

京东的本地热点缓存分析
1.png
  • 比较简单,就不对架构图进行解释了。直接看看核心点。

要点

  • 客户端如何收集key的?
    应用侧通过集成sdk,使用sdk的JdHotKeyStore.getValue。

    京东的本地热点缓存分析
    image.png
  • 服务端是如何计算热点key的?
    首先server通过netty接收消息,使用NodesServerHandler来处理消息。该处理器主要是通过 一组INettyMsgFilter过滤器完成。
    AppNameFilter,用于保存客户端应用对应的通信channel
    HeartBeatFilter,用于响应心跳
    HotKeyFilter,用于进行热点key探测。这里重点介绍下该Filter。
  • HotKeyFilter 如何工作?
    过滤器通过生产者消费者模式,通过生产者将消息发送阻塞队里。然后多线程消费者进行消费。

    京东的本地热点缓存分析
    image.png
  • 在消费的时候就是在进行统计,那么是如何统计key的访问次数的呢?
    采用的是滑动窗口实现,这也是流控的常用算法。这里简单做下说明:
    首先server中将每个key创建滑动窗口对象,整体数据结构如下:
    Map>
class SlidingWindow {
/**
     * 循环队列,就是装多个窗口用,该数量是windowSize的2倍
     */
    private AtomicInteger[] timeSlices;
    /**
     * 队列的总长度
     */
    private int timeSliceSize;
    /**
     * 每个时间片的时长,以毫秒为单位
     */
    private int timeMillisPerSlice;
    /**
     * 共有多少个时间片(即窗口长度)
     */
    private int windowSize;
    /**
     * 在一个完整窗口期内允许通过的最大阈值
     */
    private int threshold;
    /**
     * 该滑窗的起始创建时间,也就是第一个数据
     */
    private long beginTimestamp;
    /**
     * 最后一个数据的时间戳
     */
    private long lastAddTimestamp;
}
  • 滑动算法是如何工作的?
    通过简单举例来说明, 现在假设我们需要在检测出一个key在5s内访问是否超过100。将windowSize设置为5, 每个时间片是1000ms,一共设置10个时间片(为啥?)
    如下图,计算当前时间的时间片。

    京东的本地热点缓存分析
    image.png

    对当前时间片进行+1操作,假设当前时间片为7,那么有效的时间片为 7 6 5 4 3,其他时间片需要进行清零。通过计算7 6 5 4 3时间片得到总数。

  • 上个问题中,时间片设置为windowSize的2倍是否合理?
    我们考虑每个时间点只会使用一个时间片,其实只要设置为windowSize+1即可, 这样每次只需要清理一个时间片。
    后来和小伙伴们讨论了下发现还是得用2倍窗口,原因就不说了,给大家点思考空间
  • 最后回顾下整体流程
  1. NodesServerHandler使用AppNameFilter保存应用对应的channel信息
  2. 使用HotKeyFilter将消息发送队列,使用消费者进行计算
  3. 计算时使用滑动窗口计算,对应超过阈值的key,使用已经保存的channel进行消息的发送
  4. 客户端收到消息便在本地进行缓存。
  • 简单分析,如有不足,请指正,谢谢

参考

京东hotkey

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。