Language agnostic 允许部署的应用程序可热修复的好策略有哪些?

Language agnostic 允许部署的应用程序可热修复的好策略有哪些?,language-agnostic,deployment,maintenance,Language Agnostic,Deployment,Maintenance,在理想情况下,我们的开发过程将是完美的,定期发布的版本将经过彻底的测试,因此永远不需要“热修复”正在运行的应用程序 但是,不幸的是,我们生活在现实世界中,有时bug会从我们身边溜走,直到我们在下一个版本中忙于编写代码时才会露出丑陋的面孔。现在需要修复该错误。不作为下一个计划发布的一部分。今晚交通停止时就不行了现在 你如何处理这种需要?它确实会与良好的设计实践背道而驰,比如将代码重构成漂亮的离散类库 在生产服务器上手工编辑标记和存储过程可能会导致灾难,但也可以避免灾难 对于应用程序设计和部署技术,

在理想情况下,我们的开发过程将是完美的,定期发布的版本将经过彻底的测试,因此永远不需要“热修复”正在运行的应用程序

但是,不幸的是,我们生活在现实世界中,有时bug会从我们身边溜走,直到我们在下一个版本中忙于编写代码时才会露出丑陋的面孔。现在需要修复该错误。不作为下一个计划发布的一部分。今晚交通停止时就不行了现在

你如何处理这种需要?它确实会与良好的设计实践背道而驰,比如将代码重构成漂亮的离散类库

在生产服务器上手工编辑标记和存储过程可能会导致灾难,但也可以避免灾难


对于应用程序设计和部署技术,有哪些好的策略可以在维护需求和良好的编码实践之间找到平衡?

[尽管我们在发布前进行了大量测试,]我们所做的是:

我们的SVN如下所示:

/repo/trunk/
/repo/tags/1.1
/repo/tags/1.2
/repo/tags/1.3
现在,无论何时发布,我们都会创建一个标签,并最终在生产中签出。在我们进行生产之前,我们要做的是登台,它[服务器更少,但]与生产几乎相同

创建“标记”的原因包括,我们的应用程序在生产代码中的某些设置与“trunk”略有不同(例如,不会通过电子邮件发送错误,但会记录错误),因此创建标记并提交这些更改是有意义的。然后在生产集群上签出

现在,每当我们需要热修复一个问题时,我们首先在tags/x中修复它,然后从tag中更新svn,这是很好的。有时我们会进行阶段性处理,但会遇到一些问题(如拼写等小问题/琐碎问题),我们会绕过阶段性处理

唯一要记住的是应用从
tags/x
trunk
的所有补丁


如果您有多台服务器,则运行所有这些操作非常有帮助。

一种策略是为不同的组件大量使用声明式外部配置文件

这方面的例子:

  • 通过以下工具进行数据库访问/对象关系映射
  • 通过类似/
  • 通过类似/

通过这种方式,您通常可以将关键组件分离为独立的部分,在不重新编译的情况下热修复正在运行的应用程序,并无缝地使用源代码控制(特别是与存储过程相比,存储过程通常需要手动进行源代码控制)。

我们将代码划分为框架代码和业务定制。业务定制类是使用一个单独的类加载器加载的,我们有一个工具可以将更改提交给正在运行的生产实例。每当我们需要对任何类进行更改时,我们都会对其进行更改并将其提交给正在运行的实例。正在运行的实例将拒绝旧的类加载器,并使用新的类加载器重新加载类。这类似于EJB的Jboss热部署。

如何处理开发中的修复测试?通常,在一个开发盒上,我有一百万个东西指向我的主干文件夹,需要重新配置。另外,SVN标签相对于发布时简单地记录最新版本号有什么好处?谢谢好问题,我扩展了我的答案,并补充说我们有一个登台环境。(RE:difference)这是一个用例,使用标签比使用修订版更容易,正如我所解释的,我们在发布之前会添加特定于生产/阶段的内容。希望有帮助。