改了配置,不想重启,怎么整?

简介: 精选回答:有什么好办法,不重启服务,就能够修改配置么?

有个水友在知识星球提问:沈老师,我们有个连接超时的配置,平时是300毫秒,双11压力上来了,数据库变慢了,平均请求处理时间增加到了500毫秒,于是我们决定将连接超时改为1000毫秒,但这个过程需要重启服务,会影响正在执行的请求。有什么好办法,不重启服务,就能够修改配置么? 不妨设,读取与设置超时的伪代码如下:

// 从配置文件中读取超时配置

timeout = CGlobalConf::readFileConf(“timeout”);

// 设置请求超时阈值

CConnectionPool::setTimeout(timeout);

  不重启服务,重新载入配置的常见方式有3这么几种,不难但很使用,花1分钟和大家说一说。   方案一:发信号触发配置重载 这种方法无需加入任何组件, 新增一个信号捕捉函数 ,来处理配置的重新载入。  

// 服务启动时,设置ctrl+c回调函数

signal(SIGINT, sigint_shenjian_process);

 

// 捕获ctrl+c时,执行配置重新载入动作

void sigint_shenjian_process(int){

         //从配置中读取超时配置

         timeout= CGlobalConf::readFileConf(“timeout”);

         //设置请求超时阈值

         CConnectionPool::setTimeout(timeout);

}

  当需要变更配置时,只需要: (1)修改配置文件; (2)发送信号,触发配置重新载入; 画外音:啥,不知道如何向服务发信号?   方案二:检测配置文件变化,自动重新载入 这种方法无需手动发送信号,修改完配置文件,自动检测,自动载入,需要加入 文件监控组件 画外音:这类组件开源的也不少。   文件监控组件如何能监控文件的变化呢? 别想复杂了,可以 定期检查文件的md5或者last_modify_time  

// 服务启动时,初始化

CFileMonitor::init(){

 // 获取初始md5

 old_md5=xxx;

}

 

// 启动一个进程,监控文件变化

CFileMonitor::start(){

 while(1){ // 循环检查

 // 获取最新md5

 now_md5=xxx;

 // 比对md5是否变化,如果变化

 if(now_md5!=old_md5){

         //从配置中读取超时配置

         timeout= CGlobalConf::readFileConf(“timeout”);

         //设置请求超时阈值

         CConnectionPool::setTimeout(timeout);

         //修改md5

         old_md5=now_md5;  }  // 一秒后再检查  sleep(1000);  }
}
  方案三:配置中心,配置变化时回调 次方案抛弃了配置文件, 需要引入配置中心 (1)所有服务从配置中心拿配置; (2)必须从 配置中心后台修改配置 (3)配置修改, 配置中心回调引用了相关配置的服务  

// 服务启动时,从配置中心获取配置,并注册回调函数

timeout = CConfCenter::(“timeout”, callback_shenjian);

// 设置请求超时阈值

CConnectionPool::setTimeout(timeout);

 

void callback_shenjian(timeout){

         //在配置中心修改配置时,会收到回调

         CConnectionPool::setTimeout(timeout);

}

  修改配置,不重启服务,上面三种方式都很常见,不难但实用。 画外音:特别是前两种方式,瞬间就能实现。   希望大家有收获。

本文转自“架构师之路”公众号,58沈剑提供。

目录
相关文章
|
监控 安全 Shell
Zabbix Server trapper 命令注入漏洞 (CVE-2017-2824)
Zabbix Server trapper 命令注入漏洞,攻击者可通过特定Payload获取服务器执行权限。
621 1
|
SQL 缓存 分布式计算
SparkSQL与Hive metastore Parquet转换
Spark SQL为了更好的性能,在读写Hive metastore parquet格式的表时,会默认使用自己的Parquet SerDe,而不是采用Hive的SerDe进行序列化和反序列化
SparkSQL与Hive metastore Parquet转换
逐字稿示例(20K*14) 背调信息
张三,Java开发工程师,曾任职于广州天星数字科技有限公司,主导微服务架构设计与高并发场景优化。精通SpringCloud、Redis分布式锁、MySQL性能调优,熟悉Seata分布式事务及MQ异步解耦。擅长通过缓存预热、Lua脚本、分库分表等手段提升系统性能,在优惠券超卖控制、数据一致性保障等方面有丰富实战经验。具备良好的技术沟通能力与团队协作精神,追求代码质量与系统稳定性。
|
5月前
|
存储 人工智能 分布式计算
中国AI云市场阿里云占比35.8%位列第一
国际权威市场调研机构英富曼(Omdia)发布《中国AI云市场,1H25》报告——2025年上半年,中国AI云市场规模达223亿元,阿里云占比35.8%位列第一,市场份额高于2到4名的总和,凭“AI全栈”继续引领市场发展。
|
供应链 NoSQL Java
用Redisson写一个库存扣减的方法
通过本文的介绍,我们详细讲解了如何使用Redisson实现一个简单的库存扣减功能。通过使用分布式锁,可以确保库存扣减操作的原子性和高效性。希望本文能帮助您更好地理解和应用Redisson,构建高效、可靠的库存管理系统。
513 15
|
网络协议
计算机网络的分类
【10月更文挑战第11天】 计算机网络可按覆盖范围(局域网、城域网、广域网)、传输技术(有线、无线)、拓扑结构(星型、总线型、环型、网状型)、使用者(公用、专用)、交换方式(电路交换、分组交换)和服务类型(面向连接、无连接)等多种方式进行分类,每种分类方式揭示了网络的不同特性和应用场景。
2859 156
|
存储 搜索推荐 测试技术
《C 语言函数指针:解锁灵活编程的强大工具》
《C 语言函数指针:解锁灵活编程的强大工具》介绍了函数指针在 C 语言中的应用,通过实例解析其在程序设计中的灵活性和强大功能,帮助读者掌握高效编程技巧。
|
Linux Go
[golang]使用gocron编写定时任务
[golang]使用gocron编写定时任务
692 0
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用合集之将多个表的数据导入到一个 source table中如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Windows
Win11怎么重置系统?(小白专享篇)
Win11怎么重置系统?(小白专享篇)
2071 3