【问题标题】:Designing application to support config changes without restart设计应用程序以支持配置更改而无需重新启动
【发布时间】:2016-01-27 05:38:56
【问题描述】:

有哪些方法可以设计应用程序,以便无需重新启动应用程序即可更改配置?

一种方法是只拥有一个带有配置的平面文件,然后应用程序在需要特定值时从配置中读取,并且从不将任何配置值存储在内存中。

另一种选择是允许应用程序加载配置文件一次并将值存储在内存中,然后定期重新加载配置文件以防发生变化。

【问题讨论】:

  • 如果没有关于配置是什么以及必须多久检查一次配置的更多信息,您就是在问计算机程序如何获取数据,这非常广泛。跨度>
  • a) 存储在内存中很好,但是如果您在程序的其余部分工作时进行更改,请记住线程安全 [of the map...] b) 定期加载听起来很糟糕,尤其是因为您可以读取一个不完整的文件(当前写入)。如果情况允许,需要手动触发重新加载。
  • 一种方法是给应用程序一个 reload config 选项,这样如果用户更改了配置文件,他们然后点击 reload config 按钮(或其他)。

标签: c++ configuration architecture configuration-files software-design


【解决方案1】:

碰巧我最近更新了我的一个免费软件包来做到这一点。我采取的方法略有不同。

1) 我的应用程序加载它的配置,解析它,并将它存储在内存中。每次应用程序需要某些配置设置的值时,我都不会读取配置设置。

2) 但是,除了配置设置,我还存储了配置文件本身的时间戳。

3) 当应用程序响应一个事件而被唤醒并且它有事情要做时,它会检查配置文件的时间戳。如果它没有改变,则不采取进一步的行动。 stat(2) 系统调用是轻量级、廉价和快速的,并且增加的开销非常小。

4) 如果stat(2) 告诉我配置文件的时间戳已更改,应用程序会再次读取配置文件。

配置文件,作为其格式的一部分,包括一个明确的“配置结束”标记。如果我的应用程序没有看到它,这意味着我应该出去玩下一个彩票,因为我设法遇到了一个极其罕见的竞争条件,在这种情况下,当我的应用程序以某种方式最终读取一个新的配置文件时同时被我用来编辑配置文件的编辑器保存的中间!

如果代码没有看到“配置结束”标记,则在应用程序下次唤醒并检查配置文件的时间戳之前不会采取进一步的行动。

5) 新的配置文件被读取和解析后,我验证新的配置设置。这里会进行一些内部健全性检查。如果完整性检查失败,则在向系统日志报告错误后不会采取进一步措施。

6) 只有在完整性检查通过后,先前存储的配置设置和值才会被从新配置文件中读取的更新值以及新配置文件的新时间戳替换。直到我们下次再见面。

附:保存的配置设置受互斥体保护。当应用程序需要检查特定配置设置的值时,它会持有互斥锁。第 6 步还获取了足够长的互斥锁,以便用新验证的更新配置设置替换当前配置设置。

【讨论】:

  • 很酷的方法。您能否在免费软件包中发布您所做更改的链接?另外,我们是否可以使用两个版本的配置文件来处理读取正在写入的文件的问题?然后使用符号链接指向可以安全读取的文件。这类似于版本控制系统有多个分支,但只有一个头分支。
  • 两个版本+符号链接的方法对我来说不必要的复杂,而时间戳+EOF标记的方法要简单得多。但它完全有可能对你有用,只要你通过 rename() 自动更新符号链接。 github.com/svarshavchik/courier/blob/master/courier-authlib/… 就是我说的配置文件实现。
【解决方案2】:

为避免轮询,请考虑使用来自操作系统的通知来了解您的配置文件何时被修改。大多数操作系统都提供了可以执行此操作的 API:

有许多跨平台包装器(例如herehere)可以简化事情。

【讨论】:

    【解决方案3】:

    Sam Varshavchik 的回答包含很多很好的建议。但是,还有一点值得说明...

    配置类的公共 API 将提供一个或多个 lookup() 样式的方法,用于检索配置值。为了确保线程安全,您必须确保这些lookup() 方法返回底层配置值的深层副本(而不是指针/引用)。例如,如果返回一个字符串,那么返回类型应该是std::string 而不是const std::string &const char *

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多