配置文件动态刷新

1. 背景

2. 相关知识储备

思路一 : 民科 mtime 文件最后修改时间

思路二: 科班 操作系统通知特性, 例如 linux 的 inotify

3. 相关代码设计

  1. 总结

1. 背景

配置文件动态刷新这个业务场景非常常见. 存在两个主要使用场景, 客户端和服务器.

客户端需求很直白, 我本地配置变更, 程序能及时和非及时的重刷到系统中.

服务器相比客户端做法要多些环节, 服务器本地会有一份配置兜底, 配置中心中配置发生改变会推送给触发给服务器触发内部更新操作.

我们这里主要聊场景偏向于客户端, 本地配置发生改变, 我们如何来更新内存中配置.

2. 相关知识储备

首先思考一个问题 我们如何判断一个文件发生了更新 ?

这里提供两种思路.

思路一: 民科 mtime 文件最后修改时间

在结构体中 st_atime, st_mtime, st_ctime 字段可以知道, Linux 文件有三个时间属性:

1. mtime: 文件内容最后修改时间

  1. ctime: 文件状态改变时间, 如权限, 属性被更改

  2. atime: 文件内容被访问时间

如 cat, less 等 在默认情况下, ls 显示出来的是该文件的 mtime, 即文件内容最后修改时间.

如果你需要查看另外两个时间, 可以使用 ls -l –time ctime 命令.

思路二: 科班 操作系统通知特性, 例如 linux 的 inotify

man inotify

inotify_init1 -> inotify_add_watch IN_MODIFY / inotify_rm_watch -> poll 监控机制 -> close

流程去注册关注修改时间, 当文件发生修改时候操作系统会通知上层应用具体修改详情.

linux inotify 是一种文件变化通知机制, 它是一个内核用于通知用户空间程序文件系统变化的机制,

以便用户态能够及时地得知内核或底层硬件设备发生了什么.

我们这里采用民科思路. linux inotify 对于我们场景有点大材小用了. 欢迎感兴趣人参照官方例子去尝试.

3. 相关代码设计

素材:

业务能力设计 file_set 注册和删除, file_update 触发检查和更新操作

具体思路是利用 list + mtime , 可以观察 struct 设计部分

struct file 存储文件操作对象, struct files 是 struct file list 集合.

我们知道 file_set 和 file_update 不是线程安全的. 依赖业务系统启动时候统一调用 file_set 无法运行时修改相关设置.

不知道是否有同学会采用如下设计

通过 lock 来保证线程安全.

这种思路确实能解决线程安全问题, 存在很多缺陷, file_update 业务上面很耗时, 他会阻塞 file_set 操作, 特殊情况会引发业务雪崩.

所以我们需要更针对性锁.

为了适配多线程情况. 首先我们明确下简单业务, 同步的 file list 就够用了.

我们这里单纯为了没事要吃蛋炒饭态度, 构造 file dict hash + atomic lock 来没事找事.

素材:

总体设计思路

我们先在 data 中添加数据, 如果 data 被 update 占用, 我们把数据放入 backup 中再去处理.

4. 总结

去感受其中思路. 我用C写代码很顺手. 但有时候觉得 C 在现在阶段, 不是专业吃这个饭的,

可以尝试用其它更加高级语言来轻松快捷表达自己的想法和工程版本.

对于开发生涯我花了很多年找到自己定位, 我的底层核心是一名 软件工程师. 然后语言和技术以及商业工程问题陆续通顺起来了.

(因为我的单元测试不充分, 错误可能很多, 欢迎在 github 给我提 commit or issure. 时间愉快)

Original: https://www.cnblogs.com/life2refuel/p/15775053.html
Author: 喜欢兰花山丘
Title: 配置文件动态刷新

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590627/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 你知道5分钟法则和10字节法则么?

    如果一条数据每5分钟被访问一次,那么它应该常驻在内存中。类似的,如果想存储只有0和1两个值的标志位,相比于将8个标志位打包为1个字节,将1个标志位单独存储为1个字节是更节约的选择。…

    数据库 2023年6月14日
    0102
  • Try-with-resources are not supported at language level ‘5’

    Try-with-resources are not supported at language level ‘5’没有指定maven版本导致 的 指定ma…

    数据库 2023年6月16日
    063
  • MySQL基础_索引

    一、介绍 1.什么是索引? 在一般的应用系统中,读写比在10:1左右,插入操作和一般的更新操作很少有性能问题,在生产环境中,我们遇到的最多,也是最容易出现问题的,或者一些复杂的查询…

    数据库 2023年5月24日
    0102
  • CSS样式

    css概述 层叠样式表(cascading style sheet) 层叠是指==将多个样式施加在一个元素(标签)上== 作用: 美化页面 将html代码与样式代码分离 好处: 功…

    数据库 2023年6月16日
    087
  • redis 从安装到实现远程连接–centos7下

    Java 端配置 上面的配置完成后,我们可以创建一个普通的 JavaSE 工程来测试下了,Java 工程创建成功后,添加 Jedis 依赖,如下 然后我们可以通过如下一个简单的程序…

    数据库 2023年6月16日
    078
  • 软件测试基础理论

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    数据库 2023年6月16日
    088
  • git拉项目出现的小问题

    问题描述 在IDEA中拉代码事报错。 点击查看报错信息 error: unable to read askpass response from ‘C:\Users\&#x9…

    数据库 2023年6月11日
    0100
  • 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

    前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。 可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,…

    数据库 2023年6月16日
    089
  • Logback实现按业务输出到对应日志文件

    一、方案 由于需要按业务生成不同的日志文件,看到按业务来区分,我的第一感觉就是业务其实是可以按包名来区分的。所以其实我们只要实现不同的包下面的日志输出到不同的文件,就能实现需求了。…

    数据库 2023年6月6日
    0273
  • servlet映射路径匹配解析

    开头 servlet是javaweb用来处理请求和响应的重要对象,本文将从源码的角度分析tomcat内部是如何根据请求路径匹配得到处理请求的servlet的 假设有一个reques…

    数据库 2023年6月16日
    089
  • C语言学习笔记

    C语言学习笔记 预处理 #include include指令可以将另一个源文件的全部内容包含进来 include “stdio.h” #include 用尖…

    数据库 2023年6月14日
    0104
  • Linux(CentOS)安装MinIo,详细教程,附防火墙端口开放操作

    Linux安装MinIo(已配置开机重启) 1,准备安装目录和文件 系统:CentOs #进入安装目录 cd /home/minio #在线下载二进制文件 wget https:/…

    数据库 2023年6月11日
    073
  • 事务的本质和死锁的原理・改

    由于一些错误操作和被爬的原因,我重新整理了 上一篇文章https://…

    数据库 2023年6月9日
    082
  • 使用mybatis-plus转换枚举值

    1. 使用mybatis-plus转换枚举值 枚举值转换方式有很多,有以下方式: 后端写一个通用方法,只要前端传枚举类型,后端返回相应的枚举值前端去匹配 优点:能够实时保持数据一致…

    数据库 2023年6月11日
    0147
  • Java面试题(二)–MySQL

    1 存储引擎 1、简单描述一个Mysql的内部结构? MySQL的基本架构示意图:大体来说,MySQL可以分为 server层和 存储引擎层两部分。 ① server层包括连接器、…

    数据库 2023年6月16日
    080
  • SQL语言基础

    SQL语言基础 SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新…

    数据库 2023年5月24日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球