- 工程实践 - 《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

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

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

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

相关文章

09_Java集合

一、Java集合框架概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态…

模型超参数寻优

参考某篇QSAR的sci论文设置 根据上图,我设置我的XGBoost模型: # 定义要搜索的超参数的候选值 param_grid {model__learning_rate: [0.1, 0.01, 0.001], # 调整学习率model__n_estimators: [50, 100, 200, 300,400,500], # 调整树的数量model__max_de…

【MySQL】变量、流程控制

一、变量 在MySQL的存储过程与函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。它可以分为用户自定义变量与系统变量 1、系统变量 1)系统变量分为全局变量(需要使用关键字global)和会话…

JRT监听-PDF-Excel-Img

依赖全新设计,我们无需再顾虑历史兼容性的束缚;同时,基于多年来累积的深入需求理解,JRT监听机制巧妙地借助CMD命令模式,达成了监听的全面统一。无论是PDF、Excel还是图片文件,都不再需要特殊对待或额外区分…

unity学习(15)——服务器组装(1)

1.新建好的c#项目如下: 文件夹中内容如下: 此时已经可以通过vs2022打开.sln文件,就可以打开项目了。 2.我们把逆向后(主程序)的内容的代码粘贴过去。有些逆向功底,很快可以定位到,服务器的入口…

【Java EE初阶十八】网络原理(三)

3. 网络层 网络层要做的事情主要是两方面: 1)、地址管理:制定一系列的规则,通过地址,描述出网络上一个设备的位置; 2)、路由选择:网络环境是比较复杂的,从一个节点到另一个节点之间,存在很…

【GPT-2】论文解读:Language Models are Unsupervised Multitask Learners

文章目录 介绍zero-shot learning 零样本学习 方法数据Input Representation 结果 论文:Language Models are Unsupervised Multitask Learners 作者:Alec Radford, Jeff Wu, Rewon Child, D. Luan, Dario Amodei, I. Sutskever 时间:2019 介…

Linux系统中 uboot、内核与文件系统之间的关系

前言: 最近正在学习Linux,总结了一下Linux系统中 uboot、内核与文件系统之间的关系 Linux初学者首先要搞清楚的三个文件: 引导程序(bootoader):uboot.bin/uboot.imx Linux内核镜像: zlmage 文件系统镜像:system.img/rootfs.tar.ba2 初期很多工作都是围…

文件上传漏洞--Upload-labs--Pass02--Content-Type绕过

一、什么是 Content-Type 我们在上传文件时利用 Burpsuite 进行抓包,如下图所示: 上传文件后台的源代码可能会对 Content-Type 进行规定,设置白名单 或 黑名单,这时就要利用Content-Type绕过上传含有恶意代码的 php文件。 二、代…

[ linux网络 ] 网关服务器搭建,综合应用SNAT、DNAT转换,dhcp分配、dns分离解析,nfs网络共享以及ssh免密登录

实验准备工作: 网关服务器安装:dhcp bind (yum install -y dhcp bind bind-utlis) server1安装:httpd (yum install -y httpd) 没有网络就搭建本地yum仓库或者配置网卡使其能够上网。 ( 1)网关服务器…

unity C#中的封装、继承和多态简单易懂的经典实例

文章目录 封装 (Encapsulation)继承 (Inheritance)多态 (Polymorphism) C#中的封装、继承和多态是面向对象编程(OOP)的三大核心特性。下面分别对这三个概念进行深入解释,并通过实例来说明它们在实际开发中的应用。 封装 (Encapsulation) 实例…

解决updatexml和extractvalue查询显示不全

报错注入是一种常见的SQL 注入方式,通过注入代码,触发数据库的错误响应,并从错误信息中获取有用的信息。 updatexml和extractvalue updatexml和extractvalue 是常用的两个报错注入函数 http://localhost/sqli/Less-5/?id1%27and%20updat…

【Pygame手册03/20】用于绘制形状的 pygame 模块

目录 一、说明二、画图函数2.1 接口draw下的函数2.2 pygame.draw.rect()2.3 pygame.draw.polygon()2.4 pygame.draw.circle()2.5 pygame.draw.ellipse()2.6 pygame.draw.arc()2.7 pygame.draw.line ()2.8 pygame.draw.lines()2.9 pygame.draw.aaline()2.10 pygame.draw.aaline…

【Redis】理论进阶篇------Redis的主从复制

一、原理解释 1、什么是Redis的主从复制 主从复制,是指将一台Redis服务器的数据复制到其他Redis服务器。前者称为主节点(master),后者称为从节点(slave);对于数据的复制是单项的,只能从主节点到从节点。Ma…

C#上位机与三菱PLC的通信06--MC协议之QnA-3E报文测试

1、A-3E报文回顾 1、存储区分类及访问规则 2、命令类型 命令由主命令子命令组成 3、报文结构 2、启动mc服务器 3、创建VS项目 这节继续使用上节的VS2022的项目,增加一个方法 MCTestA3E(),具体怎么创建项目,见上节的过程。C#上位机与三菱…

在 CentOS 平台下安装与配置 MySQL 5.7.36

CentOS平台常用有三种MySQL安装方式,即RPM安装包、二进制压缩包和源码包。一般来讲,建议使用二进制压缩包,因为该版本比其他的分发版使用起来要简单灵活。本次实验在 CentOS 7.6 平台上选用二进制压缩包安装方式。 1、清理MySQL安装环境 Cent…

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表,其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义,通过 SQL 语句使用视图时…

【6-1】使用hanlp进行实体抽取以及句法分析(问题待解决)

1.使用hanlp抽取法人名称、企业名称等信息 # -*- coding: utf-8 -*- from pyhanlp import *text1"1998年11月11日,马化腾和同学张志东在广东省深圳市正式注册成立“深圳市腾讯计算机系统有限公司”,之后许晨晔、陈一丹、曾李青相继加入。当时公司…

论文解读:Masked Generative Distillation

文章汇总 话题 知识蒸馏 创新点 带掩盖的生成式蒸馏 方法旨在通过学生的遮罩特征来生成老师的特征(通过遮盖学生部分的特征来生成老师的特征),来帮助学生获得更好的表现 输入:老师:,学生:,输入:,标签:,超参数: 1:使…

水质监测站工作原理!

TH-LSZ06】水质监测站的工作原理基于现代化学和生物学技术,主要通过化学分析和生物检测两种方法来检测水中有害物质。化学分析技术包括酸碱度、氧化还原电位、重金属离子、有机物、氮和磷等,而生物检测技术则主要关注病毒、细菌、真菌等微生物。 在水质…