热点数据监测方法

news2025/1/22 20:52:20

在日常开发中,我们需要着重注意一种场景-热点数据。他可能是一种请求,每次请求的数据类型都是一样的;可能是同一个数据,比如页面上公用的类型数据;可能是同一个用户大量的请求。他们都有着同一个特点,瞬时爆发量大、重复请求、频繁请求,所以这对于系统来说是非常频繁访问的数据,称为热点数据,与不常访问的数据有很明显的不同。

我们在应对热点数据情况时,主要的手段为:非法请求过滤、限流、降级、本地缓存四种。

现有技术第一种架构方法。

在请求打到服务器上面时,由服务器自身对请求key进行识别处理,将其放置到一个如哈希表结构的数据模型中,访问一次进行计数一次,当请求没有达到阈值时,请求会被转发到数据库上,达到阈值时进行访问,会将数据放置于本地jvm内存中,直接走本地缓存。





图1.1 第一种架构方法图

这种方式通过本地进行计算,会存在诸多缺点:

1. 每台机器单独计数,也就意味着每台机器单独进行本地缓存,会导致缓存不一致问题。

2. 每台机器单独计数,计数不准确,若有100台机器,100次请求,可能部分机器没有收到请求。

3. 机器重启,缓存丢失。

4. 直接存储全量数据,会浪费大量内存空间。

现有技术第二种架构方法。

使用缓冲中间件的方法,当请求打到服务层时,会优先请求缓存中间件是否有数据,不会直接请求数据库,中间件中拥有LRU结构,当Redis内存满时,会始终存储热点数据,丢弃冷数据,并且也提供了冷热数据的检测功能。这也是常使用的方式,通过Redis对数据库进行保护,同时提高查询效率。





图1.2 第二种架构方法图

这种方式通过本地进行计算,会存在诸多缺点:

1. 当出现缓存击穿和雪崩时,会出现请求直接打到DB,导致DB直接瘫痪,服务不可用。

2. 使用redis命令,redis-cli时加上–hotkeys,进行统计热key会导致redis性能降低

3.使用monitor进行实时抓取redis命令进而统计热key,或者使用现成的分析工具redis-faina,在高并发场景下会出现内存暴增、降低redis性能的问题,统计热key一般都是高并发场景,所以这是致命的。



现有技术第三种架构方法。

是一种解决热读问题的方案,针对于写少读多,通过在服务层下增加一层SLB层,进行负载均衡转发,转发到路由层Proxy,路由层Proxy负责将请求分为读请求、写请求,分发读请求到读服务器,如Mysql的从机器上,进行读取操作,将写请求分发到写服务器上,即Mysql的Master机器上,进行写操作。读机器可以横向扩充,进行读取性能的横向扩展。读写请求的分离是解决写少读多场景的优秀方案。在这种方法的基础上,可以将底层的数据中间件改变为Redis,通过Redis探测热点数据。当Redis发现热点数据后,可以通过在Proxy层增加本地缓存进行快速返回,横向增加Proxy方法可以扩展读能力,这种方式对Client端完全无感知,具体操作在Proxy层。





图1.3 第三种架构方法图

现有技术第四种架构方法。

这是一种比较完善,性能高,解决大多数场景的方法。在进行缓存获取时,通过异步将 key 访问事件 异步(通过rsyslog将请求日志写入kafka消息队列中,hermes通过消费kafka消息进行请求数统计)上报给 Hermes 服务端集群 ,根据上报数据进行“热点探测,通过ETCD集群进行推送热点数据到服务端,通过apollo进行规则配置、黑白名单、集群地址信息配置。





图1.4 第四种架构方法图

在进行热点数据探测时,在hermes服务器集群内部针对每个App的每个Key都维护了一个时间轮,每3秒钟对收到的热点请求数据进行一次计算,探测出当前的热点数据,然后通过etcd集群通知各个服务端。

hermes-sdk修改了jedis的源码,在获取key时,会先通过hermes-sdk中的代码获取是否有热点数据,本地缓存中是否存在,若存在优先取本地缓存,做到了无感知化接入,原有逻辑无需改动即可提高性能,解决热点数据危害。

现有技术第五种架构方法。

此方法为京东开发的hotKey,流计算worker集群信息注册到etcd集群,启动后的客户端通过etcd可以获取到worker集群信息,客户端与worker之间建立netty长链接,后续当有请求时,异步将请求上报给worker集群进行计算,同时worker集群通过etcd获取规则配置信息,通过规则进行分片计算,最后将结果聚合后通知给客户端。





图1.5 第五种架构方法图

此方法经受住了极强的压力测试和618严酷的实际场景,性能非常强悍。

至此本文介绍了五种热点数据探测方法,分别为本地计算缓存、缓存中间件计算、读写分离后缓存中间件计算、异步日志写入消息后计算、流计算工作群进行计算。希望在后续热点数据的使用和开发中能够为大家提供帮助。

参考资料:

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

aliyun 热key: 热点key问题的发现与解决 - 云数据库 Redis - 阿里云

有赞热key: 有赞透明多级缓存解决方案(TMC)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis---哨兵服务

一、配置哨兵服务 1、哨兵服务介绍 监视 master 服务器,发现 master 宕机后,将 slave 服务器提升为 master 服务器 主配置文件:sentinel.conf 模板文件:redis-4.0.8/sentinel.conf 哨兵服务:类似于mha的管理节点&#…

ELK日志

思维导图 一、ELK介绍 ELK是Elasticsearch、Logstash、Kibana首字母大写缩写,后续加入了Beats(Beats是负责单一用途数据采集并推送给Logstash或Elasticsearch的轻量级产品),就更名为 Elastic Stack。 Elastic Stack技术栈的功能…

JVM-GC回收机制

目录 1.判定垃圾 1.引用计数 2.可达性分析 2.清理垃圾 1.标记清除 2.复制算法 3.标记整理 4.分代回收 上文讲述的Java运行时内存划分,对于程序计数器,虚拟机栈,本地方法栈来说,生命周期是和线程有关的,随着线程而生,随线程而灭,当方法结束或者线程结束时,它们的内存就自…

细讲const与引用的关系

目录 先了解语言层面的权限 进入正题引用与const权限关系 引用权限的概念 const引用返回值时错误情况 一:返回到临时空间时权限问题 二:临时空间到调用处保存问题 结论:如果不对子函数内部数据修改、那么在父函数变量ret的类型可以设置…

vite+vue3+ts开发流程

目录 vue页面开发 数据类型开发 组件开发 API开发 页面中使用组件、API、数据类型 vue页面开发 <template><!-- 卡片区域--><el-card style"padding:0px;"><!-- 搜索与添加区域--><div style"margin-bottom: 15px;&quo…

SAP ABAP selection screen 动态获取字段名不需要回车触发

SAP ABAP selection screen &#xff0c;get field vaule without click Enter key. 有个需求&#xff0c;界面上几个字段的搜索帮助需要根据已输入值联动&#xff0c;比如AOP version 根据已输入的BU 过滤。 但尴尬的是在事件AT SELECTION-SCREEN ON VALUE-REQUEST FOR 中&a…

.Net中的标识框架Identity

中间件&#xff1a; 1、Authentication对访问者的用户身份进行验证&#xff0c;“用户是否登录成功”。 2、Authorization验证访问者的用户身份是否有对资源访问的访问权限&#xff0c;“用户是否有权限访问这个地址”。 简单描述 1、标识&#xff08;Identity&#xff09;框架…

TCP协议二:TCP状态转换(重要)

TCP状态转换分析https://www.bilibili.com/video/BV1iJ411S7UA?p44&spm_id_frompageDriver&vd_sourced239c7cf48aa4f74eccfa736c3122e65 TCP状态转换图 粗实线&#xff1a;主动端 虚线&#xff1a; 被动端 细实线&#xff1a;内核操作 状态分析 CLOSED&#xff1…

RabbitMQ:消息中间件

文章目录 概念管理界面简介4中常见交换器类型1.Direct交换器:2.Fanout交换器3.Topic交换器4.headers交换器 对象类型消息传递同步等待使用代码创建队列待续...... 概念 在微服务架构中项目之间项目A调用项目B 项目B调用项目C项目C调用项目D。。 用户必须等待项目之间内容依次的…

后端太难了,不 All in 了

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「256」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈&#xff0c;目前已经超过 2200 小伙伴加入&#xff01;去年认真准备和走下来的基…

Segment Anything Model代码讲解(二)之image_encoder

image_encoder代码解析 在transformer的结构中&#xff0c;编码是非常重要的部分。接下来看image_encoder的代码部分目录 class ImageEncoderViT def initdef forward class Block def initdef forward class Attention def initdef forward def window_partitiondef window_…

【C++】引用(下)【深度全面解析】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

自定义类型——枚举与联合体

枚举 枚举顾名思义就是一一列举 把可能的取值一一列举 枚举类型的定义 enum Day//星期 {Mon,Tues,Wed,Thur,Fri,Sat,Sun };enum Sex//性别 {MALE,FEMALE,SECRET }&#xff1b;以上定义的 enum Day &#xff0c; enum Sex 都是枚举类型 { }中的内容是枚举类型的可能取值&…

English Learning - L2 第 14 次小组纠音 复习元音 [ɔɪ ] [aʊ] [əʊ] [ɪə] 弱读 2023.4.12 周三

English Learning - L2 第 14 次小组纠音 复习元音 [ɔɪ ] [aʊ] [əʊ] [ɪə] 弱读 2023.4.12 周三 共性问题coin voice /kɔɪn/ /vɔɪs/ 中 ɔɪvowel pounds /ˈvaʊəl/ /paʊndz/ 中的 aʊshow /ʃəʊ/beer nearly /bɪə/ /ˈnɪəlɪ/ 中的 ɪəbest bed ten /best…

U-Boot 烧写与启动

1.uboot 编译好以后就可以烧写到板子上使用了&#xff0c;这里我们跟前面裸机例程一样&#xff0c;将 uboot 烧写到 SD 卡中&#xff0c;然后通过 SD 卡来启动来运行 uboot。使用 imxdownload 软件烧写&#xff0c;命令如 下&#xff1a; chmod 777 imxdownload //给予 imxdo…

超参数的设置;使用适当的尺度来选择超参数;批量归一化;测试时的批量标准化:

超参数的设置&#xff1a; 超参数之间也有重要性差异。通常来说&#xff0c;学习因子α是最重要的超参数&#xff0c;也是需要重点调试的超参数。动量梯度下降因子β、各隐藏层神经元个数#hidden units和mini-batch size的重要性仅次于α。然后就是神经网络层数#layers和学习因…

【Python38安装PyAudio过程出现错误如:Failed building wheel for PyAudio等一系列问题】

安装PyAudio过程出现错误&#xff1a;Failed building wheel for PyAudio 目前成功解决解决过程&#xff08;1&#xff09; 解决方法1 查看pip支持安装whl文件的命名方式:没解决&#xff08;2&#xff09;解决方法2 直接用终端解决 目前成功解决 环境&#xff1a;Windows11、p…

数据库实验 | 第2关:建立和调用存储过程(带输出参数)

任务描述 本关任务&#xff1a; 销售数据库有工作人员、销售单数据表 工作人员gzry数据表有雇员号gyh、姓名gyxm、出生日期csrq、学历xl、工资gz、部门bm、电话dh字段 销售单xsd数据表有销售单号xsdh、会员号hyh、雇员号gyh、销售日期xsrq、应付款yfk、实际付款sjfk字段 任…

JKind入门(二)引擎简介 BMC

如上文所说&#xff0c;JKind 使用了多个并行引擎&#xff0c;协调它们来证明需要检验属性。本文主要介绍 bounded model checking (BMC) 有界模型检验。其中会涉及到有关JKind的 K-induction &#xff08;k归纳引擎&#xff09;和 SMT求解机。 本来这些文章就是单纯就是自己的…

C语言进阶之内存操作函数

我们上一期学习的是字符串函数&#xff0c;只能操作字符串&#xff0c;如果我们想拷贝等等操作给一个整型数据或者浮点型数据&#xff0c;又该怎么办呢&#xff0c;就用到我们今天要学的内存操作函数 memcpy 内存拷贝 memmove 内存移动 memset 内存设计 memcpy操作 先来…