一、为什么需要热点缓存探测

        在回答这个问题前,我们先考虑一下:为什么光用 Redis 还不够,还需要使用本地缓存?

        一般来说,Redis 集群的性能能抗住几十万并发,能够应付大部分情况。但对于一些头部 APP,当出现热点舆情、商品秒杀活动等百万并发的场景,Redis 集群也来不及处理这么多请求,更何况对某一个热点 key 的请求会打到同一个 Redis 分片上。这会导致 Redis 服务超时甚至不可用,最终形成缓存雪崩。

        如果能把热点数据缓存到应用程序节点中,就可以解决问题,因为本地缓存有以下优势:

1、数据不需要通过网络传输,能提升性能

2、由于应用的高扩展性,本地缓存是天然的分布式存储,负载分担容易实现

3、本地缓存可以缓解远程缓存的压力

        但是,使用本地缓存最重要的问题是:本地内存有限,无法支持大量数据存储

        因此在超高并发业务下,需要引入热点缓存探测系统(以下简称“热点系统”),它解决本地缓存问题的方法大致如下:

        由于本地内存有限,所以最好是只存储热点数据,从而兼顾内存规模和缓存命中率。但是超高并发业务往往采用大量的应用节点,每个节点分担到的流量有限,所以单个节点仅分析自身的数据使用情况,难以及时得知哪些是热点 key。而热点系统把各节点的数据使用情况进行收集、汇总,从全局判断出哪些属于热点 key,再把热点 key 推送给各应用节点。

二、热点 key 的使用场景

        热点数据有两个重要特性:有限时间、流量高聚。热点 key 的使用场景主要有:

1、正面的:例如热门商品的 id、热点舆情的 id。这些 key 作为热点 key 后,数据缓存到本地,商品详情、舆情详情等信息就不用再从 Redis 获取了,减小了 Redis 压力。

2、负面的:例如使用抢票脚本的 ip 地址。这些 key 作为热点 key 后,数据缓存到本地,当请求到来后,直接从本地缓存看一下是否存在,若存在就拒绝这些请求。

        当然,热点系统只是把 key 当作一个字符串,具体在什么场景使用,非常灵活。

三、JDHotKey 架构剖析

(一)整体架构

JDHotKey 主要由 4 个组件构成:

1、etcd:etcd 是一个高性能的配置中心,可以以极小的资源占用,提供高效的监听订阅服务。主要用于存放规则配置,各 worker 的 ip 地址,以及探测出的热 key、手工添加的热 key 等。

2、client:client 是在应用中添加的引用 jar,引入后,就可以以便捷的方式去判断某 key 是否热key。同时,该 jar 完成了 key 上报、监听 etcd 里的 rule 变化、worker 信息变化、热 key 变化,对热 key 进行本地 caffeine 缓存等。

3、worker:worker 端是一个独立部署的 Java 程序,通常部署多台根据 key 的 Hash 值进行流量分担。worker 启动后会连接 etcd,并定期上报自己的ip信息,供client端获取地址并进行长连接。之后,对各个client发来的待测key进行累加计算,当达到etcd里设定的rule阈值后,将热key推送到各个client。

4、dashboard:dashboard 是一个可视化控制台,启动后会连接 etcd,之后在控制台设置各个 APP 的 key 规则。然后当worker探测出来热key后,会将 key 发往 etcd,dashboard 也会监听热 key 信息,进行入库保存记录。同时,dashboard 也可以手工添加、删除热 key,供各个 client 端监听。

(二)核心业务逻辑

1、规则维护:主要由运营人员通过 dashboard 配置热点规则,比如:对于所有 product 开头的 key,2秒内出现20次访问算热 key)。

2、热点上报:client 端会根据热点规则,将参与热点统计的 key 进行本地统计,并定期(默认 500 ms 一次)上报给 worker。上报时,会对 key 进行 hash 运算后取余,找到对应的 worker 进行上报。

3、热点统计:每个 worker 会负责自己管辖范围内的 key 的统计,采用的是滑动窗口算法。

4、热点推送:当 worker 热点统计发现热 key 时,将热 key 推送给所有的 client。此外,dashboard 也可以手动添加或删除热 key 并进行推送。

5、热点缓存:当 client 收到热点推送后,会从本地的热 key 集合中进行添加或删除。开发人员可以通过 client 提供的 SDK 查询某个 key 是否为热 key,也可以通过 SDK 从本地缓存(Caffiene)中存入、获取、删除热 key 对应的 value。

参考:https://mp.weixin.qq.com/s/xOzEj5HtCeh_ezHDPHw6Jw

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 安全加固

Linux 安全加固需要从​​用户权限、系统服务、网络防护、日志审计、文件系统、访问控制​​等多个维度入手,目标是减少攻击面、限制未授权访问、提升系统健壮性。以下是​​详细步骤实操示例​​,覆盖主流 Linux 发行版(如 CentOS/Ubuntu&am…

【Docker#2】容器历史发展 | 虚拟化实现方式

一、前言 – 容器技术发展史 容器技术是现今计算技术的重要组成部分,其发展历程可以追溯到很早的计算机系统提供的进程隔离工具。以下是容器技术的发展历程,其中涵盖了从早期的进程隔离技术到现代云计算和云原生的演变: ① Jail 时代 1979 年…

React + Mermaid 图表渲染消失问题剖析及 4 种代码级修复方案

Mermaid 是一个流行的库&#xff0c;它可以将文本图表&#xff08;例如 graph LR; A-->B;&#xff09;转换为 SVG 图表。在静态 HTML 页面中&#xff0c;Mermaid 会查找 <pre class"mermaid"> 代码块&#xff0c;并在页面加载时将它们替换为渲染后的图表。它…

[Element]修改el-pagination背景色

[Element]修改el-pagination背景色 代码 <el-pagination:current-page.sync"queryParams.current":page-size.sync"queryParams.size":page-sizes"[10, 20, 50, 100]"layout"prev, pager, next, jumper, sizes":total"queryP…

Docker 可用镜像列表

Docker 镜像源列表&#xff08;7月15日更新-长期&免费&#xff09;_dockerhub国内镜像源列表-CSDN博客

低代码可视化工作流的系统设计与实现路径研究

一、背景分析在数字化转型不断深化的背景下&#xff0c;企业业务流程呈现出高度定制化与动态调整的趋势&#xff0c;传统信息系统在开发周期、实施成本与扩展能力上的局限性日益凸显&#xff0c;已难以支撑快速响应和敏捷迭代的实际需求。面向这一现实挑战&#xff0c;基于 BPM…

mac mlx大模型框架的安装和使用

mlx是apple平台的大模型推理框架&#xff0c;对mac m1系列处理器支持较好。 这里记录mlx安装和运行示例。 1 安装mlx框架 conda create -n mlx python3.12 conda activate mlx pip install mlx-lm 2 运行mlx测试例 以下是测试程序&#xff0c;使用方法和hf、vllm等推理框架基…

JAVA 使用Apache POI合并Word文档并保留批注的实现

一、需求背景 在实际工作中&#xff0c;我们经常需要将多个Word文档合并成一个文件。但当文档中包含批注&#xff08;Comments&#xff09;时&#xff0c;传统的复制粘贴会导致批注丢失或引用错乱。本文将介绍如何通过Java和Apache POI库实现保留批注及引用关系的文档合并功能。…

Linux的服务管理工具:`systemd`(`systemctl`)和`SysVinit ` 笔记250718

Linux的服务管理工具:systemd(systemctl)和SysVinit 笔记250718 Linux的服务管理工具 Linux 的服务管理工具随着发行版和初始化系统的发展而演变。以下是主要的服务管理工具及其对应的初始化系统&#xff1a; 1. systemd (现代主流标准) 初始化系统&#xff1a; 是绝大多数…

Couchbase 可观测性最佳实践

Couchbase 介绍 Couchbase 是一个开源的分布式 NoSQL 数据库&#xff0c;专为高性能和高可扩展性设计&#xff0c;适用于实时数据处理的企业应用。它结合键值存储和文档数据库的优势&#xff0c;支持 JSON 文档存储&#xff0c;并通过 N1QL&#xff08;类 SQL 查询语言&#x…

构建基于MCP的LLM聊天机器人客户端开发指南

引言 在当今人工智能技术快速发展的时代&#xff0c;大型语言模型(LLM)已成为构建智能应用的核心组件。MCP(Modular Conversational Platform)作为一个强大的对话平台&#xff0c;为开发者提供了将LLM能力与自定义工具集成的标准化方式。本文将详细介绍如何使用Python开发一个…

接口测试的原则、用例与流程详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口的介绍软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&am…

ubuntu 22.02 带外进单用户拯救系统

不停地按 F7 &#xff0c;然后进到 menu &#xff0c;选择 ubuntu &#xff0c;然后按下 ESC &#xff0c;然后瞬间会刷一个 ubuntu 的选项&#xff08;默认是在第一的位置&#xff0c;直接快速按下 e&#xff09;即可进入单用户模式。 找到类似 linux /boot/vmlinuz-xxx rootU…

Java-75 深入浅出 RPC Dubbo Java SPI机制详解:从JDK到Dubbo的插件式扩展

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-30-新发布【1T 万亿】参数量大模型&#xff01;Kim…

【橘子分布式】gRPC(编程篇-上)

一、简介 我们之前学习了grpc的一些理论知识&#xff0c;现在我们开始正式进入编程环节。 我们的项目结构和之前的thrift结构还是一样的&#xff0c;一个common,一个client&#xff0c;一个server。只不过在grpc这里common它一般叫做api模块。还是放置一些公共的实体类&#x…

IOS 18下openURL 失效问题

突然有一天有玩家反馈说应用打开外部连接打不开了&#xff0c;于是查了一下&#xff0c;报错&#xff1a;BUG IN CLIENT OF UIKIT: The caller of UIApplication.openURL(_:) needs to migrate to the non-deprecated UIApplication.open(_:options:completionHandler:). Force…

前端面试题(React 与 Vue)

目录 一、React 函数组件 Fiber架构 组件重新渲染 组件通信 为什么不能在if中使用hook useEffect与useLayoutEffect区别 性能优化hooks 受控组件与非受控组件 redux与zustand区别 二、Vue vue2与vue3区别 生命周期 computed与watch区别 v-if与v-show区别 v-mod…

大模型格式

目录 大模型格式&#xff1a; ollma 可以加载gguf ChatGPT 说&#xff1a; &#x1f50d; 什么是 GGUF&#xff1f; 大模型格式&#xff1a; Ollama 模型格式只能运行已打包成 .gguf 格式的模型&#xff0c;或通过其 Modelfile 方式构建 ModelScope 模型格式大多使用 Hug…

数据结构 栈(1)

1. 栈的概念和结构之前几篇我们分别讲解了顺序表和单链表的内容&#xff0c;今天我们又来学习一个新的关于数据结构的内容--- 栈 。栈&#xff1a;栈也属于线性表 , 但它是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一…

【Android代码】绘本翻页时通过AI识别,自动通过手机/pad朗读绘本

核心功能&#xff1a; 打开摄像头&#xff08;可支持外接摄像头&#xff09;检测翻页&#xff08;后续考虑添加图像差异算法&#xff09;拍照后用 识图自动用 TextToSpeech 朗读文字内容 &#x1f4cc; 说明&#xff1a;使用了 CameraX&#xff08;Android Jetpack&#xff09;…