• 双版本数据加载的系统设计


    概述

    很多服务依赖数据版本迭代。如搜索系统,每天会产生一个全量索引版本。路网系统,每天会加载新版本的路网数据。一个简单的做法是每次更新数据版本时,都停止服务,重新加载最新的数据(通常在流量最低的时间点)。但这种做法显然不够优雅。更常用的方案是加载双版本数据,动态切换,而不需要停止服务。本文介绍这种方案的一种实现方式。

    架构图

    核心环节

    1. 数据推送服务将最新版本的数据推送到各个服务器上,并将数据同步状态同步到版本管理中心;
    2. 当版本管理中心接收到所有服务均收到最新版本数据时,会下发加载该数据版本的命令;
    3. 服务接收到新加载数据版本命令时,先对数据进行校验(md5),然后在加载进内存中;
    4. 版本管理中心同样会下发卸载命令,将某一版本中的数据从内存中卸载;
    5. 版本管理中心还会下发数据删除命令,将某一版本中的数据从磁盘上删除;
    6. 当版本管理中心接收到所有服务均完成最新版本数据加载后,可以切换稳定版本id;

    问答

    1、数据推送如何保障数据的完整性?

    答:一般数据推送会由专门的团队负责,主要会考虑各机器的流量均衡,使用p2p的方式加速传输。

    2、服务端如何保证数据的完整性?

    答:通过md5校验能确保完整性。会消耗一定的性能。最简单的方式可以在推送完成后,添加一个标签文件,但这种方式的容错性较低。

    3、数据加载与卸载的顺序

    答:先加载的方式。好处:加载失败后容易回退到之前的状态;坏处:会消费很多的内存。先卸载的方式。好处:内存使用不会超过平时状态;坏处:一旦后续加载新版本失败,处理比较麻烦。

    4、版本中心提供sdk与client的区别

    答:使用client的方式部署比较麻烦。在大数据交互的场景,使用sdk的性能更高(直接加载到进程中)。Client的方式可以做到与服务的隔离,对于服务的稳定性有好处。

    5、如果有数据分片,如何控制每台机器加载哪几个分片?

    答:添加了分片维度,对系统的复杂度提升了一个量级,不过基本的流程还是一样的,都是由版本管理中心来进行中心控制。

    6、数据拉取由各服务自己拉取,还是有单独的推送服务推送?

    答:数据由服务自己拉取,这样的好处是架构简单,数据统一存储在数据中心。坏处是所有的机器可能同一时间都向数据中心要数据,会造成数据中心异常繁忙,网络传输的效率低下。使用单独的数据推送服务,整体系统的复杂度上升,推送服务需要和版本管理中心保持通信,实时同步推送状态。

  • 相关阅读:
    MVC架构介绍
    C# Solidworks二次开发:获取模型、组件、主体的表面积相关API详解
    趣学python编程 (五、常用IDE环境推荐)
    Android系统修改AOSP输入法默认输入语言
    java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署
    机器学习笔记 - Deep Q-Learning算法概览
    算法 - 快速排序
    08/20迷迷糊糊但是好题挺多的一周
    LeetCode Cookbook 数组习题(9)终篇
    vue2 源码解析(四)data数据响应式
  • 原文地址:https://blog.csdn.net/zhanglehes/article/details/126386881