游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

京东毫秒级热key探测框架设计与实践,已实战于618大促

  在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题。或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户,这些突发的无法预先感知的热key都是系统潜在的巨大风险。
  风险是什么呢?主要是数据层,其次是服务层。
  热key对数据层的冲击显而易见,譬如数据存放在redis或者MySQL中,以redis为例,那个未知的热数据会按照hash规则被存在于某个redis分片上,平时使用时都从该分片获取它的数据。由于redis性能还不错,再加上集群模式,每秒我们假设它能支撑20万次读取,这足以支持大部分的日常使用了。但是,以京东为例的这些头部互联网公司,动辄某个爆品,会瞬间引入每秒上百万甚至数百万的请求,当然流量多数会在几秒内就消失。但就是这短短的几秒的热key,就会瞬间造成其所在redis分片集群瘫痪。原因也很简单,redis作为一个单线程的结构,所有的请求到来后都会去排队,当请求量远大于自身处理能力时,后面的请求会陷入等待、超时。由于该redis分片完全被这个key的请求给打满,导致该分片上所有其他数据操作都无法继续提供服务,也就是热key不仅仅影响自己,还会影响和它合租的数据。很显然,在这个极短的时间窗口内,我们是无法快速扩容10倍以上redis来支撑这个热点的。虽然redis已经很优秀,但面对这种场景时,往往也是redis成为最大的瓶颈。
  热key对服务层的影响也不可小视,譬如你原本有1000台Tomcat,每台每秒能支撑1000QPS,假设数据层稳定、这样服务层每秒能承接100万个请求。但是由于某个爆品的出现、或者由于大促优惠活动,突发大批机器人以远超正常用户的速度发起极其密集的请求,这些机器人只需要很小的代价就能发出百倍于普通用户的请求量,从而大幅挤占正常用户的资源。原本能承接100万,现在来了150万,其中50万个是机器人请求,那么就导致了至少13的正常用户无法访问,带来较差的用户体验。
  根据以上的场景,我们可以总结出来什么是有危害的热key。什么是热key
  1、MySQL等数据库会被频繁访问的热数据
  如爆款商品的skuId。
  2、redis的被密集访问的key
  如爆款商品的各维度信息,skuId、shopId等。
  3、机器人、爬虫、刷子用户
  如用户的userId、uuid、ip等。
  4、某个接口地址
  如skuquery或者更精细维度的。
  5、用户id接口信息
  如userIdskuquery,这代表某个用户访问某个接口的频率。
  6、服务器id接口信息
  如ipskuquery,这代表某台服务器某个接口被访问的频率。
  7、用户id接口信息具体商品
  如userIdskuqueryskuId,这代表某个用户访问某个商品的频率。
  以上我们都称之为有风险的key,注意,我们的热key探测框架只关心key,其实就是一个字符串,随意怎么组合成这个字符串由使用者自己决定,所以该框架具备非常强的灵活性,可以完成热数据探测、限流熔断、统计等多种功能。以往热key问题怎么解决
  我们分别以redis的热key、刷子用户、限流等典型的场景来看。
  redis热key:
  这种以往的解决方式比较百花齐放,比较常见的有:
  1)上二级缓存,读取到redis的keyvalue信息后,就直接写入到jvm缓存一份,设置个过期时间,设置个淘汰策略譬如队列满时淘汰最先加入的。或者使用guavacache或caffeinecache进行单机本地缓存,整体命中率偏低。
  2)改写redis源码加入热点探测功能,有热key时推送到jvm。问题主要是不通用,且有一定难度。
  3)改写jedis、letture等redis客户端的jar,通过本地计算来探测热点key,是热key的就本地缓存起来并通知集群内其他机器。
  4)其他
  刷子爬虫用户:
  常见的有:
  1)日常累积后,将这批黑名单通过配置中心推送到jvm内存。存在滞后无法实时感知的问题。
  2)通过本地累加,进行实时计算,单位时间内超过阈值的算刷子。如果服务器比较多,存在用户请求被分散,本地计算达不到甄别刷子的问题。
  3)引入其他组件如redis,进行集中式累加计算,超过阈值的拉取到本地内存。问题就是需要频繁读写redis,依旧存在redis的性能瓶颈问题。
  限流:
  1)单机维度的接口限流多采用本地累加计数
  2)集群维度的多采用第三方中间件,如sentinel
  3)网关层的,如Nginxlua
  综上,我们会发现虽然它们都可以归结到热key这个领域内,但是并没有一个统一的解决方案,我们更期望于有一个统一的框架,它能解决所有的对热key有实时感知的场景,最好是无论是什么key、是什么维度,只要我拼接好这个字符串,把它交给框架去探测,设定好判定为热的阈值(如2秒该字符串出现20次),则毫秒时间内,该热key就能进入到应用的jvm内存中,并且在整个服务集群内保持一致性,要有都有,要删全删。热key进内存后的优势
  热key问题归根到底就是如何找到热key,并将热key放到jvm内存的问题。只要该key在内存里,我们就能极快地来对它做逻辑,内存访问和redis访问的速度不在一个量级。
  譬如刷子用户,我们可以对其屏蔽、降级、限制访问速度。热接口,我们可以进行限流,返回默认值。redis的热key,我们可以极大地提高访问速度。
  以redis访问key为例,我们可以很容易的计算出性能指标,譬如有1000台服务器,某key所在的redis集群能支撑20万s的访问,那么平均每台机器每秒大概能访问该key200次,超过的部分就会进入等待。由于redis的瓶颈,将极大地限制server的性能。
  而如果该key是在本地内存中,读取一个内存中的值,每秒多少个万次都是很正常的,不存在任何数据层的瓶颈。当然,如果通过增加redis集群规模的形式,也能提升数据的访问上限,但问题是事先不知道热key在哪里,而全量增加redis的规模,带来的成本提升又不可接受。热key探测关键指标
  1、实时性
  这个很容易理解,key往往是突发性瞬间就热了,根本不给你再慢悠悠手工去配置中心添加热key再推送到jvm的机会。它大部分时间不可预知,来得也非常迅速,可能某个商家上个活动,瞬间热key就出现了。如果短时间内没能进到内存,就有redis集群被打爆的风险。
  所以热key探测框架最重要的就是实时性,最好是某个key刚有热的苗头,在1秒内它就已经进到整个服务集群的内存里了,1秒后就不会再去密集访问redis了。同理,对于刷子用户也一样,刚开始刷,1秒内我就把它给禁掉了。
  2、准确性
  这个很重要,也容易实现,累加数量,做到不误探,精准探测,保证探测出的热key是完全符合用户自己设定的阈值。
  3、集群一致性
  这个比较重要,尤其是某些带删除key的场景,要能做到删key时整个集群内的该key都会删掉,以避免数据的错误。
  4、高性能
  这个是核心之一,高性能带来的就是低成本,做热key探测目的就是为了降低数据层的负载,提升应用层的性能,节省服务器资源。不然,大家直接去整体扩充redis集群规模就好了。
  理论上,在不影响实时性的情况下,要完成实时热key探测,所消耗的机器资源越少,那么经济价值就越大。京东热key探测框架架构设计
  在经历了多次被突发海量请求压垮数据层服务的场景,并时刻面临大量的爬虫刷子机器人用户的请求,我们根据既有经验设计开发了一套通用轻量级热key探测框架JdHotkey。
  它很轻量级,既不改redis源码也不改redis的客户端jar包,当然,它与redis没一点关系,完全不依赖redis。它是一个独立的系统,部署后,在server代码里引入jar,之后就像使用一个本地的HashMap一样来使用它即可。
  框架自身会完成一切,包括对待测key的上报,对热key的推送,本地热key的缓存,过期、淘汰策略等等。框架会告诉你,它是不是个热key,其他的逻辑交给你自己去实现即可。
  它有很强的实时性,默认情况下,500ms即可探测出待测key是否热key,是热key它就会进到jvm内存中。当然,我们也提供了更快频率的设置方式,通常如果非极端场景,建议保持默认值就好,更高的频率带来了更大的资源消耗。
  它有着强悍的性能表现,一台8核8G的机器,在承担该框架热key探测计算任务时(即下面架构图里的worker服务),每秒可以处理来自于数千台服务器发来的高达16万个的待测key,8核单机吞吐量在16万,16核机器每秒可达30万以上探测量,当然前提是cpu很稳定。高性能代表了低成本,所以我们就可以仅仅采用10台机器,即可完成每秒近300万次的key探测任务,一旦找到了热key,那该数据的访问耗时就和redis不在一个数量级了。如果是加redis集群呢?把QPS从20万提升到200万,我们又需要扩充多少台服务器呢?
  该框架主要由4个部分组成
  1、etcd集群
  etcd作为一个高性能的配置中心,可以以极小的资源占用,提供高效的监听订阅服务。主要用于存放规则配置,各worker的ip地址,以及探测出的热key、手工添加的热key等。
  2、client端jar包
  就是在服务中添加的引用jar,引入后,就可以以便捷的方式去判断某key是否热key。同时,该jar完成了key上报、监听etcd里的rule变化、worker信息变化、热key变化,对热key进行本地caffeine缓存等。
  3、worker端集群
  worker端是一个独立部署的Java程序,启动后会连接etcd,并定期上报自己的ip信息,供client端获取地址并进行长连接。之后,主要就是对各个client发来的待测key进行累加计算,当达到etcd里设定的rule阈值后,将热key推送到各个client。
  4、dashboard控制台
  控制台是一个带可视化界面的Java程序,也是连接到etcd,之后在控制台设置各个APP的key规则,譬如2秒出现20次算热key。然后当worker探测出来热key后,会将key发往etcd,dashboard也会监听热key信息,进行入库保存记录。同时,dashboard也可以手工添加、删除热key,供各个client端监听。
  综上,可以看到该框架没有依赖于任何定制化的组件,与redis更是毫无关系,核心就是靠netty连接,client端送出待测key,然后由各个worker完成分布式计算,算出热key后,就直接推送到client端,非常轻量级。
  02该框架工作流程
  1、首先搭建etcd集群
  etcd作为全局共用的配置中心,将让所有的client能读取到完全一致的worker信息和rule信息。
  2、启动dashboard可视化界面
  在界面上添加各个APP的待测规则,如app1它包含两个规则,一个是userId开头的key,如userIdabc,每2秒出现20次则算热key,第二个是skuId开头的每1秒出现超过100次则算热key。只有命中规则的key才会被发送到worker进行计算。
  3、启动worker集群
  worker集群可以配置APP级别的隔离,也可以不隔离,做了隔离后,这个app就只能使用这几个worker,以避免其他APP在性能资源上产生竞争。worker启动后,会从etcd读取之前配置好的规则,并持续监听规则的变化。
  然后,worker会定时上报自己的ip信息到etcd,如果一段时间没有上报,etcd会将该worker信息删掉。worker上报的ip供client进行长连接,各client以etcd里该app能用的worker信息为准进行长连接,并且会根据worker的数量将待测的key进行hash后平均分配到各个worker。
  之后,worker就开始接收并计算各个client发来的key,当某key达到规则里设定的阈值后,将其推送到该APP全部客户端jar,之后推送到etcd一份,供dashboard监听记录。
  4、client端
  client端启动后会连接etcd,获取规则、获取专属的workerip信息,之后持续监听该信息。获取到ip信息后,会通过netty建立和worker的长连接。
  client会启动一个定时任务,每500ms(可设置)就批量发送一次待测key到对应的worker机器,发送规则是key的hashcode对worker数量取余,所以固定的key肯定会发送到同一个worker。这500ms内,就是本地搜集累加待测key及其数量,到期就批量发出去即可。注意,已经热了的key不会再次发送,除非本地该key缓存已过期。
  当worker探测出来热key后,会推送过来,框架采用caffeine进行本地缓存,会根据当初设置的rule里的过期时间进行本地过期设置。当然,如果在控制台手工新增、删除了热key,client也会监听到,并对本地caffeine进行增删。这样,各个热key在整个client集群内是保持一致性的。
  jar包对外提供了判断是否是热key的方法,如果是热key,那么你只需要关心自己的逻辑处理就好,是限流它、是降级它访问的部分接口、还是给它返回value,都依赖于自己的逻辑处理,非常的灵活。
  注意,我们关注的只有key本身,也就是一个字符串而已,而不关心value,我们只探测key。那么此时必然有一个疑问,如果是redis的热key,框架告诉了我哪个是热key,并没有给我value啊。是的,框架提供了是否是热key的方法,如果是redis热key,就需要用户自己去redis获取value,然后调用框架的set方法,将value也set进去就好。如果不是热key,那么就走原来的逻辑即可。所以可以将框架当成一个具备热key的HashMap但需要自己去维护value的值。
  综上,该框架以非常轻量级的做法,实现了毫秒级热key精准探测,和集群规模一致性,适用于大量场景,任何对某些字符串有热度匹配需求的场景都可以使用。热key探测框架性能表现
  该key已经历了多次大促压测、极端场景压测以及618大促线上使用,这期间修复了很多不常见、甚至有些匪夷所思的问题,之前也发表过相关问题总结文章。
  这里我们仅对它的性能表现进行简单的阐述。
  etcd端:
  etcd性能优异,官方宣称秒级读写可达数万,实际我们使用中仅仅是热key的推送,以及其他少量信息的监听读写,负载非常轻。数千级别的客户端连接,平时秒级百来个的热key诞生,cpu占用率不超过5,大部分时间在1左右。
  worker端:
  worker端是该框架最核心的一环,也是承载分布式计算压力最大的部分,需要根据秒级各client发来的key总量来进行资源分配。譬如每秒有100万个key待测,那么我们需要知道单个worker的处理能力,然后决定分配多少个worker机器来均分这些计算任务。
  这一块也是调优的核心地方,越高的qps,就是越低的成本。我简单列举一些之前的测试数据。
  8核8G的worker单机场景负载,totalDealCount为累计计算过的key数量(进行完累加、推送热key到client等完毕后,数量1),totalReceiveCount为累计收到的key数量(刚收到尚未参与计算)。expireCount为收到时从客户端发出到worker收到已经超过5秒,不参与计算的key数量。
  以上每10秒打印一次,可以看到处理量每10秒大概是160万次。
  机器cpu占有率达到70左右,高峰地方多是gc导致,整体到这个压力级别,我们认为它已经不能再大幅加压了。
  换用16核16G机器后,同样的数据量即10秒160万不变,16核机器要轻松的多。
  cpu占有率在30多,整体负载比较轻,加大数据源后。
  10秒达到200万时,cpu上升至40多,说明还有继续增加压力的空间。后续经过极限压力写入,我们验证了单机在30万以上QPS情况下可稳定工作半小时以上,但CPU负载已很高,存在不确定性风险,这样的性能表现足以应对大部分突发场景。
  综上,我们可以给出性能的简单结论,使用8核的worker机器,单机每秒可处理每秒10万级别的key探测计算和推送任务。使用16核的机器,可较为轻松应对20万每秒的处理任务。
  用户可以根据该性能标准,来分配相应的worker数量。譬如你的应用每秒有100万个请求,你要探测的维度有userId、skuId两个,那么就需要自己去估算大概有多少个skuId和userId,假如100万个请求分别来自于100万个不同的用户、每个用户都访问了不同的sku,那么就是200万的待测key。所以你需要10台worker会比较稳妥。

农村池塘里的小蝌蚪,人可以吃吗?不好意思,我才抹嘴,实话实说回答这个问题很容易招黑。希望我不要被和谐掉,我不是坏人,我只陈述一种事实而矣。一是因为大家觉得吃蝌蚪好象是一种很黑暗与暗黑的料理;二是大……微信诞生于哪一年?2011年1月21日。这个也是大家最熟悉的东西,但是对于他的基本情况,其实我们还是很少去了解的,今天我也就来普及普及。1、成立:微信是腾讯在2011你那1月21日推出的一……为什么华为手机越来越贵?第一,抓住高收入群体消费心理,贵的就是好的。第二,利用大部分国人迫害妄想症,总是有人要加害朕,仇视漂亮国心理,傍苹果手机这个大款,只追苹果手机价格,不追苹果技术。第三,利用那几……新能源汽车电池剩余多少电量开始充电新能源汽车用户一般会在电量剩余30以下的时候进行充电,而有家用充电桩和单位停车场的用户中有超过四分之一的人会随时充。根据调研结果显示,新能源汽车用户一般会在电量剩余30以……苹果手机和安卓手机哪个用起来更方便?问苹果手机和安卓手机哪个更方便,就好比问一个人是左手重要还是右手重要一样滑稽!不存在也不会有十全十美的手机,苹果和安卓最大的差距无非就是系统差异,这是一种底层逻辑的比拼,也是一……助听器声音小听不清,是坏了吗?应该没有坏,先检查是否有异物堵住了,看看电量是否充足。实在不行可以送到售后进行检测!当然还有可能是人的听力下降了。感觉助听器声音变小了,有很多种原因,简单的来说有以下几种……对手增多,留给小鹏汽车的时间不多了8月26日下午,小鹏汽车对外公布2021年二季度业绩报告。这也是小鹏汽车在2021年7月登陆港股后发布的首份财报。财报显示,在2021年第二季度,小鹏汽车的营业收入为37……科技创新引领桥梁行业发展(履职风华)来源:党媒默认号租户作为一名大桥人,我曾先后任职于中铁大桥局和中铁大桥设计院,见证了中国桥梁行业追赶和领先世界的腾飞过程。改革开放以来,我国大量建造公路、铁路、桥梁等交通……证券之星APP据日经新闻:诺基亚(NOK。US)等公司寻求从包括丰田汽车(TM。US)在内的公司收取专利费用。诺基亚(NOK。US)公司简介:诺基亚公司是全球领先的手机制造商,其生产的……iPhoneX镜头还存在进灰情况吗?欢迎在点击右上角关注:太平洋电脑网,更多有趣资讯等着您哦。对不起,还是存在的。只要百度一下:iPhoneX镜头进灰。你就会发现,iPhoneX的进灰的进灰的情况还是……为什么组装店都不推荐r53600?我把回答说的言简意赅一点!其实买AMD产品的,多数对电子产品有一些了解,但是为什么英特尔还是出货量最大!第一点:利润,英特尔的CPU存在散片,与盒装最多差上好几百,……6899元有戏!华为P50Pro再次被确认,大底主摄曲面屏今年华为手机的销量在国内以及海外市场都出现了不同程度的下滑,可以说是过得异常艰难。但是华为P50Pro作为华为的高端旗舰,依然是代表了华为的包括软硬件,相机,性能等全方面强大实……
你的iPhone拍的怕是假照片,最美iPhone摄影在这里IPPAWARDS和首部iPhone同诞生于2007年这项赛事的创办人叫KenanAktulunIPPAWARDS被广大网友称为手机影像界的……为了看奥运重新安装一台exsi软路由今天重新安装了一个软路由,本懒得写,因为现在等着计算机视频压缩,所以就写一下吧。之前因为停电导致esxi的u盘坏了,凑合用ac88u,结果最近大家都在看奥运,路由器有点不……高通创投进一步扩展在华投资,持续培育5GAI生态创新在2021高通技术与合作峰会上,高通创投宣布对五家中国公司的风险投资,其中包括对聚焦机器人和人工智能(AI)的科技企业庞勃特、蜂窝车联网(CV2X)和计算机视觉相关解决方案提供……曾经的高端旗舰,现已降至冰点价,依旧无人问津三星手机一般都是超高价手机。即使是中档手机,部分型号也需要消费者支付3000元的价格。这也是大多数国内消费者不喜欢购买三星手机的原因之一。事实上,即使三星的手机价格没有现在这么……视觉导航的扫地机能不能买?看看和激光导航的对比测试前言扫拖一体的扫地机好不好用?现在依然有人认为给它清理太麻烦,还不如手动拖地。可对于有的人来说,用了之后就再也离不开,不用弯腰、不用钻床底,洗洗抹布不算啥事。我就是属于后……自动驾驶轨迹规划PonyTech是小马智行Pony。ai推出的深度技术科普专栏,由专业的工程师总结归纳出自动驾驶领域的技术实践及研究成果。本文主题为自动驾驶中轨迹规划的探索和挑战,主要内容包括……买了车以后你们都知道了什么事?一:有车以后能找到美眉的概率会大大增加,你的生活圈子里面,自己有车又独自一人生活的男人,是不是少之又少啊?我特意在这个问题上仔细的烟酒了一番。确定了两个根本原因,1:能否……浙江湖州低调富豪掌舵国内特钢生产龙头企业,身价91亿浙江湖州知名富豪:掌舵国内特钢龙头企业,身价91亿推荐语:湖州,浙江省辖地级市,是一座具有2300多年历史的江南古城,同时也是国家历史文化名城。除此之外,湖州还是长……人气最高的好物竟是TA?欧拉好物研究所公布投票结果不知不觉,热度十足的欧洲杯即将进入淘汰赛阶段,而令女生们欣喜的欧拉好物研究所则正式公布了喜爱度top5的好物作品。在经历了全网征集、层层筛选以及投票终选过后,最令喵粉们喜爱的,……无人机还可以这么用?一、方案背景近几年大量农作物秸秆已成为难以处理的废弃物,每到夏忙秋收秸秆焚烧高发期,田间露天焚烧秸秆已逐渐成为一大公害,不仅污染大气环境,同时还会引发火灾,威胁群众的生命……从专业的角度去选购,助你早日选到心仪的扫地机近几年扫地机真的非常火爆,让很多没有用过扫地机的用户也忍不住想要入手。但是,我们在选购的时候就会犹豫不决,也有很多问题:什么扫地机好用?会不会买到不好的扫地机?扫地机怎么……联发科展示天玑游戏引擎,玩家们苦等多年的旗舰技术终于要来了你是否期待有那么一天,在手机上玩游戏也能享受到如PC端游一般丝滑畅快、身临其境的体验,如今这个梦想即将实现。近日联发科秀出了一系列的天玑旗舰技术,其中就包含了多项先进的移动端游……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网