当前位置: 首页 > news >正文

- 工程实践 - 《QPS百万级的有状态服务实践》01 - 存储选型实践

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


        《QPS百万级的无状态服务实践》已经完成。截止目前为止,支持需求“给系统传入两个日期,计算间隔有多少天”的QPS百万级服务架构已经完成。如图1:

  

图1

        可是这个架构不能满足需求“给系统传入两个日期和国家信息,计算中间有多少个节假日”,也不能满足需求“查到最近用户的历史查询记录”。

        首先每个国家,每年的节假日不一样。以中国为例,每年的五一的开始时间和结束时间,由国务院办公厅大约提前一年发布。所以我们的服务需要实时去更新节假日的信息。这时候第一个问题来了,数据如何更新。

        第一步是数据生产,由于国家很多,每个国家每年的节假日发放的网站和数据格式都可能变化,而这种更新频率不高,但又十分重要的数据,一般需要自动化生产+人工检测。先通过API或者爬虫爬取到信息,然后程序检测,程序检测有风险的人工介入。所以我们的架构升级为图2。

      

图2

       这里我们面临着第一个存储选型。那就是我们的节假日数据存在哪里。这里我们从数据量大小、写频率、读频率、数据生产成本、存储成本等几个角度,分析数据特征。

  • 数据量大小:每个国家节假日不超过100个,一共195个国家,不超过20000个节假日,假设每个节假日key为30个字节的,时间信息为两个int32的值,那总的大小不超过5MB
  • 写频率:一年的节假日一般在一年的某一天更新,加上更正,195个国家,365天,写频率大约是1次/天
  • 读频率:这里取决于业务需求,如果我们希望新的节假日数据发布之后,我们可以在一分钟内更新,那我们读取数据数据频率大约是1次/分钟
  • 数据生产成本:这里数据生产是依赖自动化程序+少量人工,整体来说成本偏低。所以即使数据丢失,重新生产也能接受。不过这可能会让服务小时级不能工作,所以数据备份也是需要的
  • 存储成本:目前计算机资源,磁盘相对便宜,成本更高的是CPU和内存。所以存储在磁盘本身便宜,而存储中间件的成本,基本取决于需要读取数据的延迟和频率

        分析完数据特征,下一步要做的就是技术选型。技术选型,本质上做的事情是,找到满足业务需求的最便宜的方案(这里的便宜不止是机器资源,还是开发、维护成本)。从上面的业务特征,可以大概刻画出我们想要的存储中间件特征为,数据量不大(按数据量大小收费比较划算),写少读多(数据读取便宜,写可以贵点),数据生产成本不高,对业务小时级别影响(有备份,但也不要成本太高)

        这里我不会选择Redis,因为数据可以分钟级更新,10秒级的数据延迟服务都可以接受,那内存型的存储太贵了点。同理,我也不会选择Mysql,内存+磁盘型依然有些浪费。所以磁盘存储的对象存储系统更便宜,也能满足我的需求,以阿里云对象存储系统OSS为例,下图是我截取的核心收费价格

    

      

图3

        如图3,我的选择是同城冗余存储标准型。因为数据取回的频率很高,且不想接受小时级别服务停止。

        很明显,这里的架构“似乎”有优化的空间,比如只在数据变化时,服务容器才去获取数据。这样获取数据频率变低,这让我们可能可以考虑低频访问型。但是目前的业务形态,我不会去做这样的事,因为这个方案,需要“数据生产方通知+服务容器轮询”,它增加了服务的复杂度,而成本大概也只是从2分钱变成了1.5分钱。但是着不意味着,所有业务都不需要,比如数据从5MB,变成了5GB、5TB、甚至5PB,量变就引起了质变。现在我们先只考虑5MB,并且我们知道50MB以内,我们的方案都没有变的必要。不要过早的考虑优化,是架构设计的重要哲学之一

        到目前为止,我们只解决了数据生产和存储的问题,数据更新的问题还没有解决。用户查询相关的问题也还没有开始考虑。这些我会在后续的《QPS百万级的有状态服务实践》系列中,分享我的经验。

http://www.lryc.cn/news/300658.html

相关文章:

  • SECS/GEM的HSMS通讯?金南瓜方案
  • wayland(xdg_wm_base) + egl + opengles——dma_buf 作为纹理数据源(五)
  • 【VTKExamples::PolyData】第二十八期 LinearExtrusion
  • Linux操作系统基础(五):Linux的目录结构
  • SolidWorks如何在一个零件的基础上绘制另一个零件
  • gin(结)
  • JavaScript 设计模式之桥接模式
  • B3651 [语言月赛202208] 数组调整
  • MessageQueue --- RabbitMQ
  • WordPress作者页面链接的用户名自动变成16位字符串串插件Smart User Slug Hider
  • Nvidia 携手 RTX 推出的本地运行 AI 聊天机器人
  • 年假作业day2
  • HTML-多媒体嵌入-MDN文档学习笔记
  • openJudge | 距离排序 C语言
  • 【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)
  • [leetcode]买卖股票的最佳时机 (动态规划)
  • 隐函数的求导【高数笔记】
  • SG3225EEN晶体振荡器规格书
  • ESP8266 常用AT指令
  • esbuild 构建工具为什么很快?
  • 解决vscode报错,在赋值前使用了变量“XXX“
  • python自动定时任务schedule库的使用方法
  • 用机器学习方法重构期货商品板块
  • 51单片机项目(29)——基于51单片机的避障跟随小车
  • 人工智能学习与实训笔记(六):百度飞桨套件使用方法
  • Linux第一个小程序-进度条
  • YoloV8改进策略:Block改进|Mamba-UNet改进YoloV8,打造全新的Yolo-Mamba网络
  • 数据分析基础之《pandas(8)—综合案例》
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • define和typedef