2011-05-24 63 views
1

我使用gen_server和gen_fsm实现了一个otp系统。存在要被读取,该软件以运行需要一些值的配置文件,一个示例可以是:读取很多时间配置文件或使用gen_server状态?

{values, [value1, value2, value3]}. 

我使用的宏,以提取这些值中的一个

define(VALUES, my_utility:get_conf_value(values)). 

的问题如下:因为?VALUES可能会经常被调用,因此配置文件被多次解析,我应该在gen_fsm的gen_server状态中嵌入?VALUES,并在需要时随时调用解压缩函数?

事实上,我非常欣赏以前的实现,因为只需通过更改配置文件中的值,就可以更改软件的行为,而不需要进行任何#state {}更改或调用。

您更喜欢哪种解决方案?

回答

2

该解决方案将取决于您的要求。性能与“正确性”。

可能的解决方案是将配置保持在进程状态并定期重新读取(检查文件修改时间是否已更改)。这可能是两个世界之间的一个很好的妥协。

摘要:从文件每次

  • 重新阅读:始终保持最新状态,但速度缓慢不必要的IO
  • 区间
  • 重新读取,存储过程状态:快速阅读,但落后
  • 手册重读:快速阅读,但相对滞后,需要手动触发
  • 一次读取和存储过程中的状态:快速阅读,需要重启更新

要求不考虑:安全性,稳定性(损坏的配置文件?)

+0

正是我的意思..在配置文件错误的情况下,系统将崩溃...安全性呢?此外,避免重新启动的一种解决方案可能是调用服务器以更新值... – user601836 2011-05-24 12:21:37

+0

安全性:如果有人访问文件系统并能够操作配置文件会怎么样。 – 2011-05-24 12:28:26

+0

破坏文件的一种解决方案是在重新读取内容时验证内容,如果内容损坏则忽略它(并在日志中输出一些错误,以便观察问题)。 – 2011-05-24 12:29:53

2

这实际上是一个比首先想到的要难得多的话题。例如:

  • 配置如何更改?
  • 是否有任何过程在更改时应该通知?
  • 您是否将配置存储在某个中间过程/状态中?这将被清除?
  • 如何确保每个人在所有不同节点上的所有不同进程中看到相同的配置?
  • 或者即使配置不正确,您的系统是否仍能正常工作?
  • 访问配置的频率如何?
  • 你在那里存储什么数据?

因此,要分析当前的解决方案:

  • 解析配置文件每次你需要一个值将是太慢,创造了太多的垃圾,如果你关心这些问题
  • 问时间gen_server的值也可能太慢,这取决于你的用例。
  • 如果你需要做很多的查找,该gen_server也可以被重载
  • 如果数据大,gen_server和你的进程之间复制时可能
  • 如果您的应用程序在多台机器上运行,你无法容忍不一致在配置上,必须协调更新发生尽可能接近posssible相同的时间(这一点,你将不得不与任何解决方案,我能想到的,如果你在乎的一致性)

另一种解决办法是将存储配置为代码。例如,您可以使用特殊的配置模块,您可以使用分析转换或通过生成实际的源文件来创建该配置模块。使用这种解决方案,配置值驻留在虚拟机的常量池中,并且获取它们尽可能少地造成垃圾(取决于您稍后使用什么数据)。

2

就我个人而言,我认为最好的解决方案是将组态作为模块。好处是:

  • 真的非常快
  • 可以通过热码的变化而变化
  • 可以是任何形式的配置文件格式生成机
  • 编译和热代码交换给你仅原子更新“正确”配置免费

PS:请参阅网络模块负载(在shell中也称为nl/1)以进行群集范围配置更改。

+0

你能否提供一些关于如何实现这个提示的网站?这个实现对我来说是新的:) – user601836 2011-05-24 16:24:33

+0

http://www.erlang.org/doc/apps/erts/absform.html http://www.erlang.org/doc/man/compile.html#forms-1 http ://www.google.cz/search q =二郎+动态+模块创建+ – 2011-05-24 16:35:12