SpringBoot服务数据热更新方案参考

背景

笔者最近在维护一个基于地图数据的服务,为了给用户提供更好的服务,数据的更新频次会逐步增加。数据格式本身是基于protobuf的,鉴于其良好的格式兼容性,大多数升级中服务本身是不需要调整的。从服务角度来说,数据热更新呼之欲出。本文探讨一种解决思路,并总结下其中发现的问题。

技术栈

Java + SpringBoot

总体思路

  1. 数据API(暂且叫DataAPI),定义出数据内容访问接口,从而将API与具体的实现对象分离,当然有时候其中会有ADataAPI,BDataAPI;
  2. 数据API工厂(暂且叫DataAPIFactory),其中包含所有版本的数据API实例,但每次仅从中获取最新实例,历史的实例在不需要的时候销毁掉;(显然这里是问题的关键)
  3. 上层服务依赖DataAPIFactory,作为统一入口;

思路落地

  1. DataAPI,将数据本身依赖的内容当做一个完整的模组,其中包含依赖等内容,想到这里,这也是个小的应用上下文;
  2. DataAPIFactory,其中包含多个DataAPI实现,这也是个小的应用上下文;
  3. 咱们的整个服务相关的实例在一个更大的上下文中,接下来探讨下这些上下文的关系。显然,DataAPIFactory由于被上层服务直接依赖,因此与整个服务的应用上下文是一致的,于是整个服务就划分为2个应用上下文,DataAPI上下文和DataAPIFactory上下文。
  4. 在SpringBoot中,以编程的方式将DataAPI作为一个独立的application启动,并将ApplicationContext实例保存在DataAPIFactory实例中便完成了上下文嵌套,销毁DataAPI实例时,直接关闭对应的ApplicationContext并删除DataAPIFactory中的实例即可;

其他问题

DataAPI上下文中metrics暴露

  1. metrics注册
    在DataAPIFactory上下文初始化完成后,发布特定的ApplicationEvent,event对象中包含DataAPIFactory上下文的MeterRegistry,DataAPI上下文中的实例监听事件并注册;
  2. metrics销毁
    由于DataAPI上下文可能有多个版本,MeterRegistry中meter也需要有tag区分,这样在特定的DataAPI上下文销毁时,一并销毁掉对应的meter;

版本的一致性

比如在处理一次request的整个过程中,其所使用的DataAPI对象都来自某个特定版本。比如笔者的定义是,接收request时容器中的最新版本。其他选项,如处理request时的最新版本(比如一次请求包含500条数据,分为5批处理,第0批和第4批使用的DataAPI版本可能是不同的)。此处仅供参考,具体咋选择得看业务场景。

DataAPI上下文的释放

释放时机

不再被使用

如何确定

笔者的实现是版本内部增加一把读写锁,默认都是读锁,如果该版本不是最新版本,当读锁数量为0时进行释放(笔者偷懒,直接加写锁,如果成功则进行释放)。这也意味着每次request开始前,获得锁,处理完成后释放锁。具体是在DataAPIFactory内部开启计划任务完成释放。

更新触发

这个就是一个消息的问题,可以是Apollo,或者消息队列。关键是要保证集群环境下消息的可靠送达。

潜在约束

  1. DataAPI实例不能太大
    假设你在k8s容器中运行服务,当版本切换时,最少有2个版本同时存在,如果实例内部提前预热缓存,则意味着容器需要分配2倍内存才能度过高峰期。然而,当旧实例在几分钟被销毁后,腾空的内存就是资源浪费,白白增加成本。

  2. 版本更新不能太频繁
    原因与太大有相似性,前者是影响乘数,这里影响被乘数,总之就是投资收益的权衡。

小结

本文介绍了基于SpringBoot的服务数据热更新思路,落地细节,后续问题以及潜在约束,作为一种热更新方案供各位看官参考,感谢阅读。

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

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

相关文章

Jenkins定时构建自动化(一):Jenkins下载安装配置

目录 ​编辑 一、jdk下载安装 1. 已下载安装jdk 2. 未下载安装jdk 二、jenkins安装 1. .war包安装 三、获取IP地址 四、jenkins网页配置 一、jdk下载安装 1. 已下载安装jdk (1)查询jdk版本命令:java -version (2)…

idea2022激活

下载激活脚本 解压后,打开文件夹如下:ja-netfilter.jar 为激活补丁: 复制补丁所在的整个文件夹到硬盘某个位置 将 ja-netfilter补丁所在的整个文件夹移动到电脑上某个位置,我是放到了 D 盘下: (路径中不…

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文…

java实训-简易计算器

程序思路 1.界面设计 首先创建Frame容器,textField文本框,Jpanel面板, 文本框放置在Fram的BorderLayout.North 面板放置在Frame的BorderLayout.Center 创建了成员变量bton 长度为25的bton数组和btonlabel数组 通过for循环创建25个bton…

Google Earth Engine(GEE)——ui.DateSlider时间进度条的设置

结果 函数: ui.DateSlider(start, end, value, period, <

基于ACO蚁群优化的城市最佳出行路径规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于ACO蚁群优化的城市最佳出行路径规划matlab仿真&#xff0c;可以修改城市个数&#xff0c;输出路径规划结果和ACO收敛曲线。 2.测试软件版本以及运行结果展示…

Google trend搜索关键词

Google trend地址&#xff1a;https://trends.google.com/trends/?geoUS&hlzh-CN 1、具体的操作步骤如下&#xff1a; 2、Google trend搜索页面如下&#xff1a;

2024-06-23 编译原理实验3——语义分析

文章目录 一、实验要求二、实验设计三、实验结果四、附完整代码 补录与分享本科实验&#xff0c;以示纪念。 一、实验要求 基于前面的实验&#xff0c;编写一个程序对使用 C—语言书写的源代码进行语义分析&#xff0c;输出语义分析中发现的错误&#xff08;涉及 17 种错误类…

JVM专题二:Java如何进行编译的

编程语言分类 通常我们将编程语言分为高级语言和低级语言&#xff0c;通常高级语言因为其易用性和可移植性而被广泛使用&#xff0c;而低级语言在需要对硬件进行精细控制时非常有用&#xff0c;例如在嵌入式系统编程或操作系统开发中。 高级语言更接近人类语言&#xff0c;易于…

mac电脑守护神CleanMyMac2024免费版本下载

&#x1f31f; 电脑的守护神&#xff1a;CleanMyMac&#x1f47e; 亲爱的数码控们&#xff0c;是不是每次看到电脑上满满的垃圾文件和缓慢的运行速度就感到头疼呢&#xff1f;别怕&#xff0c;今天我要来给你们安利一款神奇的小帮手——CleanMyMac&#xff01;它可是我们电脑的…

【驱动篇】龙芯LS2K0300之LED驱动

实验目的 点亮龙芯开发板上面的用户自定义LED灯&#xff0c;编写LED驱动以及测试用例验证实现效果&#xff0c;LED位于开发板左下方&#xff08;靠近USB口&#xff09;第二个 原理图 LED通过电阻上拉至电源P3V3&#xff0c;低电平时LED被点亮 设备树 打开arch/loongarch/boo…

【职场人】如何与同事有效沟通

在职场中&#xff0c;沟通如同桥梁&#xff0c;连接着每一位职场人士的心灵与智慧。有效的沟通不仅能让工作更加顺畅&#xff0c;还能让团队关系更加和谐。那么&#xff0c;如何与同事进行有效沟通呢&#xff1f;下面&#xff0c;我将结合个人经验和一些幽默的比喻&#xff0c;…

[ThreadX] NetX DHCP 客户端API

1、常用API nx_dhcp_create&#xff1a;创建 DHCP 实例nx_dhcp_clear_broadcast_flag&#xff1a;清除客户端消息上的广播标记nx_dhcp_delete&#xff1a;删除 DHCP 实例nx_dhcp_decline&#xff1a;向服务器发送拒绝消息nx_dhcp_force_renew&#xff1a;发送强制续订消息nx_d…

音频数据集1--LJSpeech单人语音

LJ Speech Dataset 版本号: 1.1 , 文件大小: 2.6GB 1.简介 1. 1 内容简介 LJS是一个语音数据集&#xff0c;包含 13,100 个音频片段&#xff0c;内容为Linda Johnson(欧美女性)朗读的 7 本书籍段落(非小说类)。每个片段都提供文本转录&#xff0c;片段长度从 1 到 10 秒不等&…

八大排序之希尔排序

一、概念及其介绍 希尔排序(Shell Sort)是插入排序的一种&#xff0c;它是针对直接插入排序算法的改进。 希尔排序又称缩小增量排序&#xff0c;因 DL.Shell 于 1959 年提出而得名。 它通过比较相距一定间隔的元素来进行&#xff0c;各趟比较所用的距离随着算法的进行而减小…

什么是微分和导数?

文章目录 设立问题微分特性指数特性线性特性常数特性 多项式微分导数 在机器学习领域&#xff0c;有多种解决最优化问题的方法&#xff0c;其中之一就是使用微分。 通过微分&#xff0c;可以得知函数在某个点的斜率&#xff0c;也可以了解函数在瞬间的变化。 设立问题 请想象一…

HTML 教程

HTML 教程 HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言。它描述了一个网站的结构骨架,使得浏览器能够展示具有特定格式的文本、链接、图片和其他内容。本教程将带你深入了解HTML的基础知识,包括其语法、常用标签以及如何构建一个基本的网页结构。 …

Tortoise 删除文件

1、右击需要删除的文件&#xff0c;选择Delete 2、提交

【查看显卡信息】——Ubuntu和windows

1、VMware虚拟机 VMware虚拟机上不能使用CUDA/CUDNN&#xff0c;也安装不了显卡驱动 查看显卡信息&#xff1a; lspci | grep -i vga 不会显示显卡信息&#xff0c;只会输出VMware SVGA II Adapter&#xff0c;表示这是一个虚拟机&#xff0c;无法安装和使用显卡驱动 使用上…

GitHub 标星 6

美国网友对这个大全给予了很高的评价&#xff1a;这份清单中列出的开源软件&#xff0c;不仅解决了硅谷大厂前员工的难处&#xff0c;也能为其他所有码农解除困惑。 在这套大全的指导下&#xff0c;任何一个工程师&#xff0c;都能获得类似在谷歌内部写代码的体验。xg2xg 上线…