配置文件动态刷新

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)

大家都在看

  • 从外包到互联网,加油,打工人!

    以下从公众号@BiggerBoy同步 Hello,大家好,我是walking。很久没有更新了,十分抱歉。 因为前几个月在忙两个事情,一个是练车考驾照,一个是准备面试,所以就没有时间…

    数据库 2023年6月11日
    069
  • DevOps

    Docker: ## 安装Docker yum remove docker docker-client docker-client-latest docker-common doc…

    数据库 2023年6月9日
    078
  • 分享一例同一系统里不同服务之间通信的设计方案

    优付系统结构如下。一个数据库之上,有商户接口(RestAPI)、运营后台(OMS)、商户门户这3个独立SSM应用,三者有各自不同的功能处理逻辑。 现在呢,要做一个补偿工具。当付款单…

    数据库 2023年6月9日
    0142
  • 记一次故障系列:docker 启动失败

    启动报错: csharp;gutter:true; ]# systemctl start docker Job for docker.service failed because …

    数据库 2023年6月9日
    077
  • Spring Bean的作用域

    Spring Bean的作用域或者说范围主要有五种: 作用 描述 singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的…

    数据库 2023年6月16日
    065
  • day04-2发送文件

    多用户即时通讯系统04 4.编码实现03 4.6功能实现-发送文件功能实现 4.6.1思路分析 客户端(发送者): 先把文件a.jpg读取到客户端的字节数组 把文件对应的字节数组封…

    数据库 2023年6月11日
    090
  • 索引的树结构

    二分查找 二叉树 二叉平衡树 B-TREE :二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小 缺点:业务数据的大小可能远远超过了索引数据的大小,…

    数据库 2023年5月24日
    072
  • centos8安装mysql

    前言 最近在centos8系统下部署django项目时,要用到mysql数据库,在安装中遇到了点坑,之后参考了一位博主的文章,也是顺利的安装配置成功,博主原文连接: ((20条消息…

    数据库 2023年5月24日
    094
  • Linux安装nginx并配置ssl自签证书

    一、下载nginx压缩包:官网下载地址http://nginx.org/download/,点击进入选择合适自己系统的版本,本机已centos安装nginx-1.9.1.tar.g…

    数据库 2023年6月14日
    0106
  • Typora 开始收费,改用好玩的MarkText

    收费…… 可以考虑使用: MarkText 简述MarkText MarkText 这个工具侧重于”命令”,导航栏都被收起来了。有些…

    数据库 2023年6月6日
    0132
  • 事务

    事务 *事务的简介 事务是一组操作的合集,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体,一起向系统提交或撤销操作请求,这些操作只有同时成功、同时失败; 事务的操作 查…

    数据库 2023年6月16日
    0101
  • [LeetCode]27. 移除元素

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原…

    数据库 2023年6月9日
    071
  • 23种设计模式之责任链模式

    文章目录 概览 责任链模式的优缺点 责任链模式的结构和实现 * 模式的结构 模式的实现 总结 ; 概览 责任链模式(Chain of Responsibility Pattern)…

    数据库 2023年6月6日
    0106
  • Java8Stream流2

    上期对stream流大致总结了一下,后面又做了一些练习,大家可以参考一下。 首先需要建一个 Product的实体类,后面会用到 @Data @AllArgsConstructor …

    数据库 2023年6月11日
    096
  • MySQL之视图、触发器、事务、索引及其他知识补充

    一、视图 视图是将SQL语句的查询结果当做虚拟表实体化保存起来,以后可以反复使用 create view teacher2course as select * from teach…

    数据库 2023年5月24日
    095
  • sql 优化

    对比 select * from A t1 left join B t2 on ( t1.c1 = t2.c1 or t1.c1=t2.c2) select * from A t1…

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