【问题标题】:Change config values on a specific time在特定时间更改配置值
【发布时间】:2010-11-20 12:59:08
【问题描述】:

我刚收到一封邮件,说我必须在 2009 年 9 月 1 日更改配置值(新税)。我们通常的方法是在 2009 年 8 月 31 日 23:59 醒来,然后手动更改值。这不是一个大问题,因为这种情况并不经常发生。但这让我想知道其他人如何处理这样的问题。

所以!您如何处理特定日期的配置更改?

(我们在 asp.net 中工作,但我认为这不一定是特定于语言的)

Br
卡尔·伯格奎斯特

【问题讨论】:

    标签: configuration runtimemodification


    【解决方案1】:

    我通常会将这类数据存储在这样的数据库表中

    Key,  Value,  EffectiveFrom,  EffectiveTo
    -----------------------------------------
    VAT,    15.0,      20081201,     20091231
    VAT,    17.5,      20100101,         NULL
    

    然后我会使用EffectiveFromEffectiveTo 日期来选择在给定时间有效的值。如果汇率是开放式的,那么有效的可能是 NULL 或 99991231。

    这也使您无需更改配置即可返回。例如。如果有人要求您重新计算税率变化前上个月的税款。

    【讨论】:

    • 我已经考虑过这个解决方案。我们不会将数据库用于所有服务,因此不会将数据库用作通用解决方案。
    • 你可以使用文件实现类似的东西。
    • 问题在于,您必须一个一个地消耗每个值。但是您可以使用相同的东西,但是作为值写入一个 ini 文件名/目标,然后您的解决方案就有一个 ini 文件。此外,您可以使用独立程序来处理此问题。
    • 我在这里使用 pjp - “数据库”不必是基于服务器的巨大实体,普通文件可以是数据库,并且(疯狂地概括)“正确”的解决方案这类问题,我们正在讨论的数据已经明确定义,提前知道,更改日期是以这样一种方式存储数据,您可以在运行时加载和选择适当的值 - 消除了运行更新,从而减少出错的可能性(更新未运行或更改错误)。
    【解决方案2】:

    在linux中,有一个命令“at”可以批量执行。
    详情见“man at”。

    【讨论】:

    • 调度命令的名称在 Windows 上是一样的。不过,您可以使用调度服务并不是问题的全部解决方案。
    【解决方案3】:

    说实话,接近时间醒来并改变它似乎是最简单和最便宜的方法。所有的技术解决方案都很好,但这取决于你在哪里工作。

    在我们的环境中,让某人醒来并进行更改比重新开发已经运行的软件的功能更便宜、更简单。它当然涉及更少的测试、开发开销和成本,这意味着我们倾向于像您一样手动解决问题。

    【讨论】:

    • 是的,我同意,在大多数情况下,这是最好的解决方案。
    • 当您的进程被允许接受任意数量的此类请求时,该方法的扩展性非常差......我认为最好也唤醒请求更改的人并让他们验证它一旦到位。这一额外步骤有助于减少您将来收到的此类请求的数量。
    • 我认为这取决于您在哪里工作以及如何扩展。通常对我们来说,技术解决方案实施起来很昂贵,需要大量资源(运行项目管理发布流程测试风险管理等)。让大量非常便宜的(离岸)资源上线来执行特定任务非常重要这种类型的工作更简单、更便宜。
    【解决方案4】:

    这完全取决于情况和技术。

    pjp 的想法很好,如果您从数据库中获取配置,或者作为元数据来定义整个配置集/文件的有效时间。

    另一个可能是:只需准备一个包含新条目的新配置文件,然后在午夜交换它们(可能需要重新启动服务/程序)。 可以使用 at (如给定的 bei Neeraj) 交换它们...

    如果时间有问题,您应该处理更改,或者至少在运行的服务器上处理更改的时间(以避免时间不同步问题)。

    【讨论】:

      【解决方案5】:

      我们之前遇到过同样的问题,并使用以下方法处理。 如果您对发起配置更改的来源非常了解,这将是合适的。

      在我们的例子中,源公开了一个 web 服务(实际上是第三方),它将返回修改后的配置详细信息。我们的服务器上运行着一个 Windows 服务,它会不断地轮询 Web 服务,如果有任何变化,它会更新配置文件。

      这在我们的例子中非常有效..

      您可以通过将轮询 Web 服务部分更改为您的配置更改源(例如从某个磁盘路径读取更改)来使用此方法。但我不确定如何从电子邮件中读取配置更改。

      【讨论】:

        【解决方案6】:

        为什么不制作一个 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();
        }
        

        cron:

        59 23 31 8 *  /path/to/script.sh
        

        你也可以事先测试一下,只需指向一些虚拟目录和文件

        【讨论】:

        • 如果您不想实际编写任何代码,您可以在 Windows 中使用基本的计划任务执行相同的操作。
        • 您仍然需要对脚本更改和警报过程进行编码。我同意计划任务和 Cron 作业是同一回事
        【解决方案7】:

        我见过混合方法。与其实际更改数据模型以包含 EffectiveDate/EndDate 或自己手动更改值,不如安排一个脚本来自动更改值。此外,请务必制定一个可靠的测试计划来验证所有更改。

        但是,这种类型的手动更改可能会对报告产生巨大影响。如果以前的事务直接连接到正在更改的表,历史报告中的数字可能会以非常糟糕的方式发生变化。真的没有“正确”的答案。

        【讨论】:

          【解决方案8】:

          如果我无法执行类似 pjp 的解决方案,我会使用计划任务或服务器作业在正确的时间自动更新它。 但是...我可能还在醒着检查它是否有效。

          【讨论】:

            【解决方案9】:

            看起来最好的解决方案是参数化您的配置文件并添加诸如何时应该使用某个条目的内容。这将消除对文件的任何复制或交换的需要,您的应用程序将简单地处理它。 (这适用于配置文件方法或数据库)

            如果您无法更改当前系统并且必须更换配置文件,那么您还有两种选择:

            1. 使用计划任务来启动批处理作业,甚至是 VBScript 或 PowerShell 脚本(无论您觉得什么都舒服) 确保您设置了正确的凭据以便能够在半夜执行此操作还可以在此方法中添加一些检查和缓解措施。
            2. 编写一个为您执行此操作的 Windows 服务。在这里,您拥有所需的所有灵活性。对其进行编码以完成它需要做的任何事情,做所有你需要做的检查(这样你就可以继续睡觉而不是确保它真的工作了)等等等等。然后你的服务甚至会负责调度方面,一切都会做个好人。在这里,您可以使用 xml DOM 对象和 xPath 而不是替换文件,而只需根据需要更新特定条目。

            请记住,对配置文件的任何更改都会导致您的网站重新启动,因此请确保您处理好这可能导致的所有其他内务管理工作。 (虽然如果你半夜坐在那儿复制文件,这将是完全相同的)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-27
              • 2011-12-19
              • 2017-11-07
              • 2023-04-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-29
              相关资源
              最近更新 更多