【问题标题】:App pool recycle应用程序池回收
【发布时间】:2015-01-07 15:44:11
【问题描述】:

我们正在开发一个为 24 * 7 请求提供服务的应用程序,并且不应遗漏任何请求。此应用程序托管在负载平衡环境中的 IIS 上。主服务器组 P1 和 C1,而主服务器的备份服务器是 P2 和 C2。因此,请求以负载平衡的方式发送到 P1 和 C1。如果 P1 和 C1 都下降,则 P2 和 C2 上升。 我们正在努力制定一项策略,因此我们的任何请求都不会被遗漏。计划是关闭主服务器 P1 和 C1,以便将请求转发到备份。然后启动主服务器并在备用服务器上工作。 我的问题是如何确保工作进程在我们为主服务器关闭应用程序之前服务它收到的最后一个请求。如前所述,目的是确保没有遗漏任何请求

【问题讨论】:

    标签: iis-7 w3wp worker-process


    【解决方案1】:

    如果您想确保 没有 个请求被遗漏,您可能会等待很长时间 - 回收发生时正在进行的任何请求都由原始 AppPool 提供服务。根据您的站点,其中一些请求可能是连接速度非常慢的大文件,这可能需要 小时 才能完成。在某些时候,您可能只想破坏连接并继续前进,因为知道调用者会刷新他们的页面、重新连接或以其他方式返回到原来的位置。

    在任何情况下,您都不需要多个服务器。 IIS 自动(至少在默认情况下),在启动新应用程序实例并向其发送新请求时(在应用程序更新期间)从旧应用程序实例中排出请求。 (但是请注意,对新池的任何请求都可能会停顿几秒钟,因为应用程序正在第一次加载和初始化所有内容——这是正常的,而且很难避免)。

    如果您确实拥有多台服务器,并且希望将请求处理从一台服务器切换到另一台服务器,那么您必须有某种负载平衡系统,或者是软件负载平衡器,例如 Microsoft 网络负载平衡器,或者是硬件负载均衡器,例如 F5 Big-IP。在这两种情况下,您都必须以某种方式告诉负载平衡器耗尽旧应用程序(或服务器)上的连接并将它们路由到新服务器。这可以通过他们的 GUI 手动完成,或者对于自动部署系统,需要与这些系统集成。

    【讨论】:

    • 我们有负载平衡服务器。这是我们在 IIS 中托管的 WCF 服务,它以毫秒为单位处理每个请求。所以没有像耗时请求这样的问题。对我们来说主要问题是,由于响应时间很快,我们会不断收到请求,需要确保部署不会影响响应。
    • 我正在检查此链接以了解清楚 - fullsocrates.wordpress.com/2012/07/25/…。这谈到了 IISRESET。对于应用程序池,如果我尝试关闭应用程序池(而不是回收它),IIS 是否有可能确保工作进程在池完全关闭之前完成所有请求,并且不会尽快向其发送任何进一步的请求收到应用程序池关闭请求。
    • 如果您有一个外部负载平衡器,那么 IIS 没有任何作用。只需告诉负载均衡器将新的传入请求路由到第二台服务器——它应该有某种指示符,表明第一台服务器的现有请求何时完成,此时您可以安全地进行更新。接下来,您可能想要做一些事情来“温暖”更新的应用程序(有一些与此相关的更新的 IIS 功能,但在 IIS 7 上没有,我还没有查看详细信息)。接下来,告诉负载平衡器将第一台服务器放回原处并与第二台服务器运行相同的过程。
    • 这是我们一直在考虑做的,这里唯一的担心是我们不想错过任何请求。
    猜你喜欢
    • 2011-09-20
    • 2016-06-13
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2013-10-19
    • 2011-08-22
    • 2011-02-08
    相关资源
    最近更新 更多