我使用Azure PAAS - Azure Web App(以前称为Azure网站)为我的一个客户制作了一个产品版本。我们在自动缩放模式下标记了2个最小实例。我们开始从用户那里得到抱怨,间歇性用户遇到一些问题,这些问题只有在他们积极使用网站时丢失会话变量时才会导致。
我们想知道这是怎么发生的,因为我们在“在proc中”维持会话。我们没有在第1天单独退出proc会话管理器(基于Redis缓存/数据库),因为根据文档,Azure Web应用程序默认运行粘性会话负载平衡器(当运行多个实例时) 。它在Http响应中注入ARR亲和cookie,这有助于将用户重定向到第一次与其建立会话的同一实例。
要调试此问题,我们开始在页面中打印实际的sessionId。经过多次尝试,我们重现了这个问题 - 令人惊讶的是会话被交换了。让我们说 - 我的会话ID是“1eocgtmwwwwvs1cxksyofne4”,在页面刷新后它变为“5p1hsxszq2mcqmt5i5ytqg12”,包括在会话变量中管理的所有其他信息。可怕......不是吗?
伸出手来支持紧急罚单 - 回复是:
“Azure Web Apps是一个无状态平台,我们的建议是实施最适合您环境的会话管理解决方案,避免依赖内存会话状态管理,尤其是在Web应用程序托管在多个服务器上的情况下在您考虑在不久的将来为会话管理实施缓存解决方案的情况下,我们建议现在转移到单个实例作为解决方法。我们将帮助您确保应用程序按预期工作单个实例。“
我完全明白 - 但为什么Affinity cookie会失败。我知道可以禁用Affinity cookie,但我没有禁用它。我想过分享这个故事。它可能对依赖基于Affinity cookie的粘性负载均衡器的任何其他人有用。
BTW:Redis会话提供程序实现非常简单。它只用了几分钟就完成了。
现在进行尸检 - 出了什么问题?我不认为cookie是“不支持”的浏览器。那么为什么即使在我支持cookie的浏览器中也会间歇性地失败。 PAAS资源一直在移动/交换.. ..并且我们无法在proc会话中使用...等等