京东热 -key- 探测框架新版发布,单机 -QPS- 可达 -35- 万
一般情况下,我们会把热点数据缓存下来,而缓存一般都需要有个固定的 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 平稳支撑,框架无异常。
简单点说,这个框架的主要功能就是热数据探测并推送至集群各个服务器。这个框架主要适用于以下场景:
评论