我们遇到了 IIS 和 Azure 的一个非常严重的问题。不确定这是在 IIS 方面还是我们的自定义代码方面。
我参与了两个在 Azure 中运行的网站(站点 A 和站点 B)。(标准 WebRoles,ASP.NET MVC3)。这两个站点的架构完全不同,彼此没有任何关系,但在相似的情况下都表现出相似的行为。
站点 A 在启用会话状态的情况下运行。会话存储在 SQL Azure 数据库中。大多数对站点 A 的调用都通过指向 SQL Azure 数据库的 ASP.NET SQL 成员资格提供程序进行保护
站点 B 也在启用会话状态的情况下运行。会话存储在 Azure AppFabric 缓存中。站点 B 还具有与 AppFabric 缓存和 Azure 表存储通信的 http 处理程序。
当关键 Azure 资源(如 SQL Azure 或缓存)变得非常慢时,问题开始但不会恢复。当这些资源变得非常缓慢并且每个请求的处理时间超过一分钟时,Azure 的负载均衡器会终止这些连接,但 Web 角色上的 IIS 不会从其活动队列中清除/删除这些请求。
因此,问题不在于当 SQL Azure 或 AppFabric 缓存非常慢时站点没有响应。最大的问题是当 SQL Azure 或 AppFabric Cache 恢复并开始正常工作时,站点无法恢复。请求位于活动请求列表中,并且不会消失很长时间(几个小时?)。坦率地说,我不知道他们在那里坐了多久,因为我们尽快重启了这些服务器。由于 Azure 资源偶尔会出现间歇性问题,并且由于两个站点的流量都非常高,因此两个站点很快就会在非清算请求的重压下陷入困境。IIS 队列已满,在有人进入并重新启动应用程序池之前,站点不可用。