以100%正常运行时间更新应用程序

时间:2009-01-02 16:04:00

标签: .net architecture

在过去的采访中,我被问到如何编写一个关键任务Windows服务,它必须保持100%的正常运行时间,响应速度快,并且可以更新。该服务被描述为基于远程处理的应用程序,它接收请求,执行计算并发回响应。

我的解决方案是拥有一个非常通用的服务,它只是一个网关。这项服务永远不会停止。它会将请求排队并将它们转发到另一个应用程序域中的另一个服务,该服务域实际上会处理请求。需要至少有两个这样的处理服务,因此可以降低一个处理服务,而另一个处理服务可以响应传入的请求。服务之间的接口将包括握手能力以查看服务是否正在运行。将存在非常小的超时,因此如果服务完全停止,则不会保持请求。我还强调了这个解决方案可以很好地扩展,因为你可以在不同的盒子上添加更多这些服务。

面试官对这个想法并不是太疯狂,因为跨应用领域甚至整个网络之间的延迟存在问题。我说过一个关键任务应用程序,你应该建立一个坚如磐石的基础设施,因为单靠软件是不可能的答案。他还说他们目前有一个使用relfection的系统。我考虑过将程序集加载到app域并观察目录以进行程序集更改,但这似乎太容易出错了。

有没有人建造有类似要求的东西?你用了什么解决方案?什么不起作用?反思是一种可行的选择吗?

5 个答案:

答案 0 :(得分:11)

.Net已经支持在使用过程中更新程序集。它被称为Shadow Copy,并在加载它们之前有效地将程序集复制到单独的目录中。您仍然需要卸载appdomain才能加载新版本,但其他appdomains仍然可以使用旧版本的程序集。这样,一个appdomain可以在新的appdomain加载时为请求提供服务。这也是IIS和ASP.Net处理事情的方式。

答案 1 :(得分:6)

没有100%的时间。即便是最好的系统也将停机时间称为“5个9”,这意味着99.999%的正常运行时间。

此外,关键点:此测量适用于未安排的停机时间,如故障。它不包括将系统故意用于定期维护的时间。

在任何情况下,目标都是安装/更新软件,而不会导致计划停机或其他情况。如果Web服务器本身不支持动态重新加载,那么您的解决方案似乎是正确的,但我认为现在很多服务器都内置了它。也就是说,您只需要将新文件放到服务器上,它就会自动看到某些内容已经发生变化并开始使用它们。

但是,取决于可能导致会话状态出现问题的更改的性质。也就是说,现有的用户会话可能最终会出现在会话中存储的与新代码不兼容的对象。同样,服务器可能足够聪明,可以保留原始代码的缓存副本,直到使用旧代码的所有会话都终止,但您可能需要自己处理。你的“影子服务器”方法应该很好地处理它。

答案 2 :(得分:4)

100%正常运行时间? “五个九”意味着每年315秒的停机时间。如果你能做到这一点,那你的确做得非常好。

听起来像是一个不可能的面试问题。 “......保持100%正常运行时间,响应速度快,并且可以更新......” - 给出了一个正常运行时间指标,但没有响应性指标。

延迟是一个值得担心的问题,但后来他们说这是一个远程应用程序,所以你无法摆脱它。我认为面试官本身可能不同意,也许看看你如何处理它。

答案 3 :(得分:1)

好的,没什么背景,我在无线电信公司工作,我们的平台需要绝对的正常运行时间,并且看到了所有不同的策略,你绝对不应该使用基于软件的方法,它增加了软件的复杂性,你只需要做的是添加一些硬件。

由于他们要求进行无中断升级,因此必须具有冗余系统,并且使服务器应用程序冗余的绝对最佳方法是使用硬件负载平衡器。在工作中,我们有代工厂,我们所有的新东西都在Cisco Ace负载平衡器上。

所以你需要的是两个思科负载均衡器,在它们之间设置HSRP,以便在负载均衡器之间进行故障转移。您可以非常积极地使用故障转移设置,但根据我们的经验,对这些设置过于激进可能会导致不必要的故障转移。此外,请确保关闭proxy-arp(它会省去心痛,因为默认情况下cisco启用它)。

现在,您有一组应用服务器吗?因此,您可以使用负载平衡器ping,端口ping和监视应用程序响应时间。您所需要的只是至少两台服务器,但您可以稍后添加更多(容量计划在哪里?)。所以现在这里有一个无中断的升级,在你的维护窗口期间,从负载均衡器你可以管理你的一个服务器。但负载平衡器可以做真正的wikid管理,任何当前的连接保持到自然完成为止。

在此状态下,任何请求都会转到第二台服务器,您可以随时随地为要升级的服务器执行任何操作。就像真的一样,为什么要编写一个具有花哨的应用程序域重新加载功能的应用程序,当您每3个月必须重新启动服务器以应用关键的Windows补丁时呢?只需为硬件支付现金,并且有一些能在100%的时间内正常工作的东西,并且即使遇到计划外的问题也可以让你达到5x 9的范围。

现在,下一步是地理冗余。思科确实有一个可以进行地理负载平衡的负载平衡产品,但我从未见过它。我见过的最好的地理模型实际上是基于请求的应用程序。这不是一次无中断升级,但绝对可靠。您所做的是在请求应用程序中配置主服务器和故障转移服务器IP地址。在其请求中的应用程序看到如果服务器变得不可用,将向备用数据库发起相同的请求,在这种情况下可以在同一服务器机房或备份位置。理想情况是组合,应用程序可以在一个位置或备份位置定位负载平衡器虚拟IP,您可以使用负载平衡器在每个位置保持100%。

此外,如果他担心应用程序域之间的延迟,或整个网络的延迟,那个人正在破解,因为使用正确的cisco设备,gig链接上的延迟是在微秒,并且不会是你的弱点。

祝你好运。

答案 4 :(得分:0)

Spring dm Server声称能够对OSGi包进行热部署/取消部署。如果硬件可以保持足够长的时间,您就可以在不必关闭服务器的情况下更新应用程序。如果抓住它,它将成为所有Java EE应用服务器的标准功能。