https://mp.weixin.qq.com/s/3URAvUF6zwxeF5Kkc1aWHA

京东热 key 探测框架新版发布,单机 QPS 可达 35 万

原创 Hollis Hollis 2020-08-17
 
 

对于大型的分布式系统来说,热点数据一直都是一个需要重点关注的事情,比如热卖商品、热点新闻等就都是属于热点数据的。

通常情况下,这种热点数据都会被放在缓存里面,但是即使这样,如果突然有大量流量需要访问同一个特定的数据,就会导致流量过于集中,使得很多物理资源无法支撑,如网络带宽、物理存储空间、数据库连接等。

这也是为什么某某明星官宣之后,微博上面就会出现宕机的情况。有时候这种宕机发生后,其他功能都是可以使用的,只是和这个热点有关的内容会无法访问,这其实就和热点数据有关系了。

一般情况下,我们会把热点数据缓存下来,而缓存一般都需要有个固定的key,所以,很多时候我们也称这类问题为热key问题。

如何发现热点数据

一般情况下,我们是可以通过一些手段来识别并发现热key的,主要有以下几种方式:

根据经验,提前预测

这种方法在大多数情况下还是比较奏效的。比较常见的就是电商系统中,会在做秒杀、抢购等业务开始前就能预测出热key。

但是,这种方式的局限性也很大,就是有些热key是完全没办法预测的,比如明星什么时候要官宣这种事情就无法预测。

实时收集

还有一种热点数据的发现机制,那就是实时的做收集,比如在客户端、服务端或者在代理层,都可以对实时数据进行采集,然后进行统计汇总。

达到一定的数量之后,就会被识别为热key

如何解决热key问题

解决热key问题最主要的方式就是加缓存。通过缓存的方式尽量减少系统交互,使得用户请求可以提前返回。

这样即能提升用户体验,也能减少系统压力。

缓存的方式有很多,有些数据可以缓存在客户的客户端浏览器中,有些数据可以缓存在距离用户就近的DNS中,有些数据可以通过Redis等这类缓存框架进行缓存,还有些数据可以通过服务器本地缓存进行。

这种使用多个缓存的情况,就组成了二级缓存、三级缓存等多级缓存了。总之,通过缓存的方式尽量减少用户的的访问链路的长度。

有了缓存之后,还会带来一个问题,那就是热点数据如果都被缓存在同一个缓存服务器上,那么这个服务器也可能被打挂。

所以,很多人在加了缓存之后, 还可能同时部署多个缓存服务器,如Redis同时部署多个服务器集群。并且实时的将热点数据同步分发到多个缓存服务器集群中,一旦有的集群扛不住了,立刻做切换。

单纯的对于Redis热key缓存来说,Redis是有分片机制的,同一个热key可能会都保存在同一个分片中,所以还可以在多个分片中都把热key同步一份,使得查询可以同时从多个分片进行,减少某一个分片的压力。

因为有分片,还有一种情况,就是有可能多个热key都会分到同一个分片中,为了减少这种情况的发生,可以增加更多的分片来分担流量。

京东的热key探测

前面简单介绍了热key的发现与解决,这种问题其实最明显的发生就是在电商系统或者像微博这种社交系统中。

所以很多公司内部也有很多成熟的方案。

今天想介绍一个京东内部的框架——JD-hotkey ,这是京东 APP 后台热数据探测框架。

这个框架在Gitee上面开源了(https://gitee.com/jd-platform-opensource/hotkey ),官方描述是这样的:

对任意突发性的无法预先感知的热点数据,包括并不限于热点数据(如突发大量请求同一个商品)、热用户(如恶意爬虫刷子)、热接口(突发海量请求同一个接口)等,进行毫秒级精准探测到。

然后对这些热数据、热用户等,推送到所有服务端JVM内存中,以大幅减轻对后端数据存储层的冲击,并可以由使用者决定如何分配、使用这些热key(譬如对热商品做本地缓存、对热用户进行拒绝访问、对热接口进行熔断或返回默认值)。

这些热数据在整个服务端集群内保持一致性,并且业务隔离,worker端性能强悍。

JD-hotkey探测框架,历经多次高压压测和2020年京东618大促考验。在上线运行的这段时间内,每天探测的key数量数十亿计,精准捕获了大量爬虫、刷子用户,另准确探测大量热门商品并毫秒级推送到各个服务端内存,大幅降低了热数据对数据层的查询压力,提升了应用性能。

该框架历经多次压测,8核单机worker端每秒可接收处理16万个key探测任务,16核单机至少每秒平稳处理30万以上,实际压测达到37万,CPU平稳支撑,框架无异常。

简单点说,这个框架的主要功能就是热数据探测并推送至集群各个服务器。这个框架主要适用于以下场景:

  • mysql 热数据本地缓存
  • redis 热数据本地缓存
  • 黑名单用户本地缓存
  • 爬虫用户限流
  • 接口、用户维度限流
  • 单机接口、用户维度限流限流
  • 集群用户维度限流
  • 集群接口维度限流

在官方文档中,大概介绍了一下这个框架的工作原理,这个框架主要由四个主要部分,分别是ETCD集群、worker集群、client客户端以及dashboard控制台。下图介绍了一下各个部分的主要功能及简单原理:

这个框架的使用还是相对简单的,主要分为以下几个步骤:

  • 搭建etcd集群
  • 启动dashboard可视化界面
  • 启动worker集群
  • client启动

详情见 https://gitee.com/jd-platform-opensource/hotkey 中的安装教程部分,这里就不详细介绍了。近日,这个框架在618稳定版0.2版基础上,引入了proto序列化方式,并优化了传输对象。worker单机性能从618大促稳定版的20万QPS稳定,30万极限,提升至30万稳定,37万极限。且cpu峰值下降了15%。该中间件目前在京东内部10余个核心部门接入使用,服务于京东App服务端前台、中台,数据中台等多个核心业务线。最后,目前关于热key的探测方面,京东做的还是不错的,至少他们开源了一个工具出来,给大家多了一个选择。致敬开源,给京东的开源精神点个赞!

京东热 key 探测框架新版发布,单机 QPS 可达 35 万的更多相关文章

  1. 第三篇 基于.net搭建热插拔式web框架(重造Controller)

    由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并且http上下文不支持跨域,所以我们要重造一个contro ...

  2. net搭建热插拔式web框架

    net搭建热插拔式web框架(重造Controller) 由于.net MVC 的controller 依赖于HttpContext,而我们在上一篇中的沙箱模式已经把一次http请求转换为反射调用,并 ...

  3. 【原创】谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字). 今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决. 其实热key问题说来也很简单,就是瞬间 ...

  4. 谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  5. 如何快速定位 Redis 热 key?

    背景 在 Redis 中,热 key 指的是那些在一段时间内访问频次比较高的键值,具体到业务上,商品的限时抢购.瞬时的新闻热点或某个全局性的资源,都极有可能产生热点 key. 热点 key 的出现可能 ...

  6. BAT经典面试题之redis的热KEY问题怎么解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  7. 第二篇 基于.net搭建热插拔式web框架(沙箱的构建)

    上周五写了一个实现原理篇,在评论中看到有朋友也遇到了我的问题,真的是有种他乡遇知己的感觉,整个系列我一定会坚持写完,并在最后把代码开源到git中.上一篇文章很多人看了以后,都表示不解,觉得不知道我到底 ...

  8. 基于.net搭建热插拔式web框架(实现原理)

    第一节:我们为什么需要一个热插拔式的web框架? 模块之间独立开发 假设我们要做一个后台管理系统,其中包括“用户活跃度”.“产品管理”."账单管理"等模块.每个模块中有自己的业务特 ...

  9. [Eclipse] - 集成JBoss7热加载和自动发布

    使用Eclipse + JBoss开发时,总是要重启项目或JBoss,烦人.下面方法可以很简单的实现Eclipse + JBoss热加载和自动发布. 我的环境是JBoss 7.1.1 Final 1) ...

随机推荐

  1. 基于Redis的消息队列使用:spring boot2.0整合redis

    一 . 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  2. 为什么MySQL不推荐使用uuid作为主键?

    前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么 ...

  3. [leetcode]79.Search Word 回溯法

    /** * Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...

  4. ESP8288-01S/ESP8288-01使用经验总结

    如图:ESP8288-01S/ESP8288-01的区别 超链接 ESP8288-01S/ESP8288-01是乐鑫公司推出的Wi-Fi模块,因为价格便宜迅速占领了市场,它可以做AT指令开发,也可以做 ...

  5. logback运行时动态创建日志文件

    package com.example.demo.config; import ch.qos.logback.classic.Level; import ch.qos.logback.classic. ...

  6. java中变量和标识符名命名规范

    变量存放的是内存地址,当定义一个变量后,我们可以通过变量名找到该内存地址,可以修改该内存区间的值. 标识符的命名规范:首字母:字母,下划线,$符号:其余部分:数字,字母,下划线,$. 标识符应该避开j ...

  7. docker基本入门知识-小白向

    基本概念 Docker是一个开源项目,前身是dotCloud公司的内部项目,但苦于无法扩大使用和推广,后期开源后吸引大量的开发人员的参与,以至于公司直接改名为Docker Inc. Docker项目的 ...

  8. CentOS-8.3.2011-x86_64 配置网络环境的几个方案以及问题处理方法

    1. 在安装前的环境配置中配置网络 可以通过 NETWORK & HOST NAME 进行网络配置, 推介通过这里便捷设置. 如果在安装的 CentOS 之前的配置选项中没有进行用户和网络的配 ...

  9. ABP vNext 审计日志获取真实客户端IP

    背景 在使用ABP vNext时,当需要记录审计日志时,我们按照https://docs.abp.io/zh-Hans/abp/latest/Audit-Logging配置即可开箱即用,然而在实际生产 ...

  10. #2020征文-开发板#使用Python开发鸿蒙应用--2021.01.07直播图文

    写在前面: 每年的过年前夕,手中的项目一定会告急...而自己又缺乏三头六臂七十二变等特技,所以只能在鸿蒙社区先消失一阵子了.今天再看社区的帖子,发现大家的进步可不一般,各种案例示例层出不穷,一片欣欣向 ...