东东
发布于 2024-12-17 / 2 阅读 / 0 评论 / 0 点赞

京东hotkey

热key探测中间件

构成:

1、etcd 用来做为配置中心,存储热key探测的规则

2、jar 客户端使用的jar包,更为便捷的用来判断一个key是否是热key,另外这个jar也完成了key的上报,监听配置中心的规则变更,热key变化,以及将热key缓存到本地内存缓存的功能

3、worker 用来连接配置中心,做为单独的服务,可以让客户端连接到自身,将客户端发来的key进行累加计算,触发热key规则后将热key推送给客户端

4、dashboard 可视化平台,用来编辑规则,添加key等工作,需要MySQL来存储数据

使用

1、安装etcd

github地址:Releases · etcd-io/etcd

下载解压,执行脚本启动

下载hotkey源码,启动worker,连接上etcd

仓库:hotkey: 京东App后台中间件,毫秒级探测热点数据,毫秒级推送至服务器集群内存,大幅降低热key对数据层查询压力

注意这里项目中的jdk版本要小于17才行

下载后用idea打开,看到worker是一个单独的服务,修改端口后,启动。

打开控制台

hotkey使用MySQL来存储热点规则,账号等信息

打开dashboard项目,找到初始化语句,建库建表

修改对应的配置

server:
  port: 8121
spring:
  datasource:
    username: ${MYSQL_USER:root}
    password: ${MYSQL_PASS:123456}
    url: jdbc:mysql://${MYSQL_HOST:localhost}:3306/hotkey_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&useTimezone=true&serverTimezone=GMT
    driver-class-name: com.mysql.cj.jdbc.Driver
etcd:
  server: ${etcdServer:http://127.0.0.1:2379}

之后启动控制台

新建用户、新建APP、新建规则

[
    {
        "duration": 600,
        "key": "bank_detail_",
        "prefix": true,
        "interval": 5,
        "threshold": 10,
        "desc": "热门题库缓存"
    }
]

在本地项目引入client。

首先在hotkey源码中打包对应的client包为jar包

然后在本地自己的项目中引入该包,初始化

添加配置

# 热 key 探测
#hotkey:
#  app-name: mianshiya
#  caffeine-size: 10000
#  push-period: 1000
#  etcd-server: http://localhost:2379

初始化

/**
     * 初始化 hotkey
     */
    //@Bean
    public void initHotkey() {
        ClientStarter.Builder builder = new ClientStarter.Builder();
        ClientStarter starter = builder.setAppName(appName)
                .setCaffeineSize(caffeineSize)
                .setPushPeriod(pushPeriod)
                .setEtcdServer(etcdServer)
                .build();
        starter.startPipeline();
    }

业务使用

if (JdHotKeyStore.isHotKey(key)){
          // 是,就从本地获取
          Object cacheQuestion = JdHotKeyStore.get(key);
          if (cacheQuestion != null){
              return ResultUtils.success((QuestionVO) cacheQuestion);
  }
}
// 查询数据库

// 放入本地缓存(这个方法内部会再次判断key是否是热key,当是热key才会放入内存中)
JdHotKeyStore.smartSet(key,questionVO);