当前位置: 首页 > 科技观察

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

时间:2023-03-19 13:42:00 科技观察

有水友在知识星球上提问:沉老师,我们有一个连接超时配置,一般是300毫秒。双十一压力来了,数据库变慢了,平均请求处理时间增加到500毫秒,所以我们决定把连接超时改成1000毫秒,但是这个过程需要重启服务,会影响请求被执行。有没有什么好的方法可以在不重启服务的情况下修改配置呢?让我们设置它。读取和设置超时的伪代码如下://从配置文件中读取超时配置timeout=CGlobalConf::readFileConf("timeout");//设置请求超时阈值CConnectionPool::setTimeout(timeout);有3种常见的方法可以在不重新启动服务的情况下重新加载配置。这并不困难,但非常有用。花1分钟和大家聊聊。方案一:发送信号触发configurationreload这种方法不需要添加任何组件,增加一个信号捕获函数来处理configuration的reload。//服务启动时,设置ctrl+c回调函数signal(SIGINT,sigint_shenjian_process);//捕获ctrl+c时,执行配置重载动作voidsigint_shenjian_process(int){//从配置中读取超时配置timeout=CGlobalConf::readFileConf(“timeout”);//设置请求超时阈值CConnectionPool::setTimeout(timeout);}当需要更改配置时,只需要:修改配置文件;发送信号触发配置重新加载;画外音:什么,不知道如何向服务发送信号?解决方案2:检测配置文件更改并自动重新加载。此方法不需要手动发送信号。修改配置文件后,会自动检测并加载。您需要添加一个文件监控组件。画外音:这种类型的开源组件有很多。文件监控组件如何监控文件变化?别想的复杂,可以定期查看文件的md5或者last_modify_time。//服务启动时,初始化CFileMonitor::init(){//获取初始md5old_md5=xxx;}//启动一个进程,监听文件变化CFileMonitor::start(){while(1){//循环检查//获取最新的md5now_md5=xxx;//比较md5是否有变化,如果有变化if(now_md5!=old_md5){//从配置中读取超时配置timeout=CGlobalConf::readFileConf("timeout");//设置请求timeoutThresholdCConnectionPool::setTimeout(timeout);//修改md5old_md5=now_md5;}//一秒后查看sleep(1000);}}方案三:配置中心,当配置发生变化时,回调子方案丢弃配置文件,需要引入配置中心:所有服务都从配置中心获取配置;必须从配置中心后台修改配置;配置修改,配置中心回调引用相关配置的服务;//服务启动时,从配置中心获取配置并注册回调函数timeout=CConfCenter::("timeout",callback_shenjian);//设置请求超时阈值CConnectionPool::setTimeout(timeout);voidcallback_shenjian(timeout){//在配置中心修改配置时,会收到回调CConnectionPool::setTimeout(timeout);}修改配置不重启服务。以上三种方法都很常用,不难但是很实用。画外音:尤其是前两种方式,瞬间就能实现。希望大家有所收获。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文