配置文件动态刷新

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)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球