我刚收到一封邮件,说我必须在 2009-09-01 更改配置值(新税)。我们通常的方法是在 2009 年 8 月 31 日 23:59 醒来,然后手动更改值。这不是一个大问题,因为这种情况并不经常发生。但这让我想知道其他人如何处理这样的问题。
所以!您如何处理特定日期的配置更改?
(我们在 asp.net 中工作,但我认为这不一定是特定于语言的)
卡尔·伯格奎斯特
我刚收到一封邮件,说我必须在 2009-09-01 更改配置值(新税)。我们通常的方法是在 2009 年 8 月 31 日 23:59 醒来,然后手动更改值。这不是一个大问题,因为这种情况并不经常发生。但这让我想知道其他人如何处理这样的问题。
所以!您如何处理特定日期的配置更改?
(我们在 asp.net 中工作,但我认为这不一定是特定于语言的)
卡尔·伯格奎斯特
我通常会将这种数据存储在这样的数据库表中
Key, Value, EffectiveFrom, EffectiveTo
-----------------------------------------
VAT, 15.0, 20081201, 20091231
VAT, 17.5, 20100101, NULL
然后我会使用EffectiveFrom
和EffectiveTo
日期来选择在给定时间有效的值。如果利率是开放式的,那么有效的可能是 NULL 或 99991231。
这也使您无需更改配置即可返回。例如,如果有人要求您重新计算税率变化前上个月的税款。
老实说,接近时间醒来并改变它似乎是最简单和最便宜的方法。所有的技术解决方案都很好,但这取决于你在哪里工作。
在我们的环境中,让某人醒来并做出改变比重新开发已经工作的软件的功能更便宜、更简单。它当然涉及更少的测试、开发开销和成本,这意味着我们倾向于像您一样手动解决问题。
在linux中,有一个命令“ at
”用于批量执行。
详见“ man at
”。
我们之前遇到过同样的问题,并使用以下方法处理。如果您对发起配置更改的来源很熟悉,这将是合适的。
在我们的例子中,源暴露了一个 web 服务(实际上是第三方),它将返回一个修改后的配置细节。我们的服务器上运行着一个 Windows 服务,它会不断地轮询 Web 服务,如果有任何变化,它会更新配置文件。
这在我们的情况下非常有效..
您可以通过将轮询 Web 服务部分更改为您的配置更改源(例如从某个磁盘路径读取更改)来使用此方法。但我不确定如何从电子邮件中读取配置更改。
为什么不只是制作一个 shell 脚本来换出文件。在 cron 中运行它并在一分钟前切换文件,如果不成功则发送警报文本,如果成功则发送电子邮件。
这是 Linux 机器上的一个示例,但我认为您明白了这一点,并且可以在 Windows 机器上执行此操作。
脚本:
cp /path/to/old/config /path/to/backup/dir/config.timestamp
cp /path/to/new/config
if(/path/to/new/config exsits) {
sendSuccessEmail();
} else {
sendPanicTextAlert();
}
计划:
59 23 31 8 * /path/to/script.sh
您也可以事先进行测试,只需指向一些虚拟目录和文件
这完全取决于情况和技术。
pjp 的想法很好,如果您从数据库中获取配置,或者作为元数据来定义整个配置集/文件的有效时间。
另一个可能是:只需准备一个带有新条目的新配置文件,然后在午夜交换它们(可能会重新启动服务/程序)。可以使用 at (如给定的 bei Neeraj) 交换它们...
如果时间是一个问题,您应该处理更改,或者至少在运行的服务器上处理更改的时间(以避免时间不同步问题)。
如果我不能做类似 pjp 的解决方案,我会使用计划任务或服务器作业在正确的时间自动更新它。但是......我可能仍然醒着检查它是否有效。
我见过混合方法。与其实际更改数据模型以包含 EffectiveDate/EndDate 或自己手动更改值,不如安排一个脚本来自动更改值。此外,请确保有一个可靠的测试计划来验证所有更改。
但是,这种类型的手动更改可能会对报告产生巨大影响。如果以前的事务直接连接到正在更改的表,历史报告中的数字可能会以非常糟糕的方式发生变化。真的没有“正确”的答案。
看起来最好的解决方案是参数化您的配置文件并添加诸如何时应该使用某个条目的内容。这将消除对文件的任何复制或交换的需要,您的应用程序将简单地处理它。(这适用于配置文件方法或数据库)
如果您无法更改当前系统并且必须交换配置文件,那么您还有两个选择:
请记住,对配置文件的任何更改都会导致您的站点重新启动,因此请确保您处理好这可能导致的所有其他内务处理。(虽然如果你半夜坐在那儿复制文件,这将是完全相同的)