- 工程实践 - 《QPS百万级的有状态服务实践》02 - 冷启动和热更新

        本文属于专栏《构建工业级QPS百万级服务》


        继续上篇《QPS百万级的有状态服务实践》01 - 存储选型实践。如图1架构,我们已经解决了数据生产的问题。

图1

        但是我们的服务已经在运行了,并实时处理大量的请求,我们如何把内存中的数据版本更新呢。直接加载数据更新内存肯定是不行,因为如果来了一个请求,想查看4月30日,到5月2日中间的节假日数量,而这个时候五一假期从0430-0502更正到0501-0503,而我们的算法是遍历0420到0502每一天是否是节假日。那么在遍历到0501时,数据发生了替换,由于之前已经判断了0430是节假日,之后又认为0503也是节假日,则最终会认为0430-0503都是节假日,则错误地返回了4天。或者同时来了多份需要更新的数据,则请求返回更难预期。

        任何一个请求在处理过程中,不能更新依赖数据版本。业界常见的解决办法为冷启动和热更新。冷启动可以理解为停车-换轮胎-开车,热更新是开着车换轮胎。

        冷启动大部分的人都接触过,比如游戏需要退出重启更新,银行会在某些时段更新系统,并停止访问。对于我们的系统,冷启动可以是提前告知用户,凌晨2:00-4:00,不提供服务。然后关闭服务,重启应用加载最新的节假日依赖数据。总的来说,冷启动适合服务变化大,或者服务运行时兼容数据更新成本很大的情况。从代码逻辑层面,冷启动不会增加复杂度,如图2,只要关闭程序,更新节假日数据就行了。更新的方式可以是用新的数据替换之前目录下的数据。

    

图2

         热更新,最大的优势则是对用户是无感,但是它增加了程序的复杂度。热更新的逻辑则如图3。数据每次使用时先在步骤1上读锁,防止读的过程中数据更新,然后步骤2使用数据,使用完之后在步骤3释放读锁。同时程序有另外一个专门用于数据更新的线程,当发现有数据时,会在步骤4新开辟一片内存,存储新版数据B,然后在步骤5上写锁,防止数据更新的过程中数据被读取,然后在步骤6,替换数据,在步骤7释放写锁,这样之后的请求读取的都是数据版本B了。数据更新时则上写锁完成数据替换。当然这里还有优化的空间,就是减少读锁的获取时间。比如上读锁之后,直接获取数据版本A的指针,然后释放锁。更新时,不是替换数据的内存,而是替换指针的内存。但是本质思想和图3没有区别,这里就不再展开。

        图3

        那业务容器如何发现数据更新呢,对于冷启动时,我们可以写一个脚本,逻辑是“关闭进程,覆盖节假日数据”。对于热更新,有两种方式,一种是服务定期轮询,另一种是数据准备好后主动触发+服务重启时取数据。

        定期轮询很简单,每分钟都去oss指定目录下遍历,看看有没有比内存中更新的数据。如果有,就下载数据并更新。

        主动触发看似简单,只要数据生产的程序在生产完之后,通过http告知我们的业务容器就行了。但是我们的服务器有很多台,并且有的机器可能正在重启或者置换,ip也会变化,这个时候nginx则不够用了,不仅需要支持更复杂规则的负载均衡服务器,也会降低负载均衡的效率,所以这不是一个好的办法。我们的一般解决办法,是增加一个能把消息持久化,并发送给所有机器的工具,我们把它叫做消息队列中间件。于是我们的架构又升级到图4了。

图4

        截止目前为止,我们的架构已经可以支持节假日依赖数据更新,并更新过程对用户无感了。并且我们通过消息队列还能在节假日数据更新的第一时间,让业务容器感知并更新数据。虽然目前还有数据一致性的问题。但是下一部分,我会先详细说一下消息队列相关经验,因为它太重要,太常见了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网页中实现打开qq添加群聊

网页中实现打开qq添加群聊 效果 登录qq群管理后台 1. https://qun.qq.com/#/handy-tool/join-group 2 . 复制生成的链接 代码 在html中使用的话就直接粘贴到对应的内容里面就行 如果是添加点击事件的话&#xff1a; <div click"joinQQGroup">添加群聊</…

Vue23 数据监测总结

代码 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>总结数据监视</title><style>button{margin-top: 10px;}</style><!-- 引入Vue --><script type"text/javascript" src"…

mqtt 协议中的 QoS等级介绍

一、QoS等级 MQTT设计了一套保证消息稳定传输的机制&#xff0c;包括消息应答、存储和重传。在这套机制下&#xff0c;提供了三种不同层次QoS&#xff08;Quality of Service&#xff09;&#xff1a; QoS0&#xff0c;At most once&#xff0c;至多一次&#xff1b;QoS1&…

OpenAI全新发布的Sora,到底意味着什么?

16日凌晨&#xff0c;OpenAI发布了文本视频的工具&#xff08;text-do-video&#xff09;Sora&#xff0c;整个世界再次被震撼。 Sora的出现&#xff0c;到底意味着什么&#xff1f; 目录 Sora的背景与概述Sora是什么&#xff1f;能为我们做些什么&#xff1f;存在的一些问题 文…

C++ 里设置Expose on Spawn csv 通过 UStruct 导入为 DataTable

一.蓝图里面暴露的设置如下&#xff1a; C 中写法如下&#xff1a; 属性如下&#xff1a; 关卡蓝图中Spawn时会有 参数接口 二. 创建UObject类&#xff0c;并在C中声明结构体。继承FTableRowBase 在Excel里&#xff0c;创建对应csv文件 如果在头文件修改了属性&#xff0c;使用…

情人节官宣频发,白敬亭宋轶等多对情侣陷情风。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 情人节甜蜜满溢&#xff0c;娱乐圈情侣们争相晒幸福。2024年&…

Rust Vs Go:从头构建一个web服务

Go 和 Rust 之间的许多比较都强调它们在语法和初始学习曲线上的差异。然而&#xff0c;最终的决定性因素是重要项目的易用性。 “Rust 与 Go”争论 Rust vs Go 是一个不断出现的话题&#xff0c;并且已经有很多关于它的文章。部分原因是开发人员正在寻找信息来帮助他们决定下…

CogCopyRegionTool

关于visionpro工具操作原理文章甚少&#xff0c;以下是本人自己查阅visionpro官方文档完成的&#xff1a; “复制区域”工具允许您对单个图像或两个独立的图像执行多个复制操作&#xff1a; 将输入图像的一部分复制到新的输出图像。 1、 将输入图像的一部分复制到现有的目标…

一杯咖啡一根烟,一个bug改一天,让程序员崩溃的43个瞬间

一杯咖啡一根烟&#xff0c;一个bug改一天 新年刚刚开始&#xff0c;我估计大家都还处于打发时间的状态吧&#xff01;让我们来谈谈一些轻松的内容&#xff0c;调整一下心情&#xff0c;希望所有在座的朋友&#xff0c;在2024年能够bug多多&#xff0c;收入多多&#xff0c;美女…

Apache DolphinScheduler中ZooKeeperCDH不兼容问题的解决方案

背景 看到Apache DolphinScheduler社区群有很多用户反馈和讨论这块问题&#xff0c;针对不兼容的问题&#xff0c;不仅需要自己重新编译各一个新包&#xff0c;而且因为默认是使用zk-3.8的配置&#xff0c;所以会出现不兼容问题。使用zk-3.4配置即可适配3.4.x 解决办法&#…

北京地区MySQL培训课程:深度解析查询语句中的WHERE条件设置

MySQL如果在查询时想要获取满足的条件的记录&#xff0c;就需要使用WHERE子句&#xff0c;WHERE子句用于在 MySQL 中过滤查询结果&#xff0c;只返回满足条件的数据记录。 语法格式&#xff1a; SELECT column1, column2, ...FROM table_name WHERE condition; SELECT 列名,…

【Linux】Framebuffer 应用

# 前置知识 LCD 操作原理 在 Linux 系统中通过 Framebuffer 驱动程序来控制 LCD。 Frame 是帧的意思&#xff0c; buffer 是缓冲的意思&#xff0c;这意味着 Framebuffer 就是一块内存&#xff0c;里面保存着一帧图像。 Framebuffer 中保存着一帧图像的每一个像素颜色值&…

才气系统与逻辑系统道装实现的比较

才气系统与逻辑系统道装实现的比较 道装道装思想简介烛火流形学习引擎&#xff0c;流形学习的引入王船山信息熵&#xff0c;简称王船山熵&#xff1b;凝聚态数学可计算函数科学方法道装由来琴语言简介逻辑与才气的逐层比较表格&#xff08;王船山熵&#xff09; 道装 道装思想…

LeetCode 0589.N 叉树的前序遍历:深度优先搜索(DFS)

【LetMeFly】589.N 叉树的前序遍历&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/n-ary-tree-preorder-traversal/ 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表…

防火墙 iptables(二)--------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由…

【Web】CVE-2022-22947 SpringCloud Gateway SpEL漏洞学习

目录 简介 Actuator操作Gateway接口列表 复现流程 漏洞复现 简单原理 简介 Spring Boot Actuator 和 Spring Cloud Gateway 是 Spring 生态系统中的两个关键组件&#xff0c;它们在微服务架构中扮演着不同的角色&#xff0c;下面简要介绍它们之间的关系&#xff1a; Spri…

MobaXterm下载安装及使用教程

一、MobaXterm的简介 MobaXterm是一款功能强大的远程计算工具&#xff0c;集成了诸多网络工具和便利功能&#xff0c;包括SSH、X11服务器、SFTP等&#xff0c;支持Windows系统。用户可以使用MobaXterm来轻松管理远程服务器&#xff0c;进行文件传输&#xff0c;远程桌面显示等操…

九宫格锁屏模块,九宫格设置密码

要使用九宫格设置密码,先用自定义一个九宫格样式,使用的自定义的view画出九个点,然后重写onMeasure和onDraw,这两个方法,并处理onTouchEvent,这个事件 在Android视图的绘制和布局过程中&#xff0c;onMeasure和onDraw这两个方法的调用顺序是固定的。以下是它们通常的调用顺序&…

Java数字孪生智慧工地数据大屏APP项目源码

目录 智慧工地云平台核心功能 1.劳务管理 2.视频监控 3.安全教育 4.进度管理 5.环境监测 6.塔吊监控 7.升降机监控 8.工地广播 9.深基坑高支模 10.AI识别 11.安全质量 智慧工地建设的价值和意义 危大工程管理 智慧工地聚焦施工现场一线生产活动&#xff0c;利用物…

typescript类型详解

因为介绍了ts的全部类型,所以比较长,各位可以通过目录选择性观看 typescript类型概述typescript 类型注解概念-->监测类型变化 ts类型注解语法ts常用类型原始类型对象类型对象类型_数组类型 ts新增,联合类型ts函数类型ts 函数类型 voidts 函数类型可选参数 ts 对象类型ts 可…