扩展 ASP.NET 会话状态服务器
Posted
技术标签:
【中文标题】扩展 ASP.NET 会话状态服务器【英文标题】:Scaling up the ASP.NET session state server 【发布时间】:2009-01-28 18:28:12 【问题描述】:场景:
网站托管在三台服务器上,每台服务器都使用IIS。
所有三台服务器都使用 Windows Server 2003 附带的网络负载平衡软件进行集群。
所有三个站点都配置为将会话状态存储在一个单独的服务器上,该服务器被指定为“状态服务器”。
我被要求扩大“状态服务器”。有没有一种方法可以让我拥有多个状态服务器并在它们之间同步状态,因此如果其中一个状态服务器出现故障,其他状态服务器将能够提供状态信息?
【问题讨论】:
【参考方案1】:我们在我工作的地方使用Scale Out State Server,它的工作非常出色,而且设置起来非常简单。我了解 Microsoft 也在开发一款名为 Velocity 的类似产品,但我对此没有任何经验。
SOSS 的唯一缺点是您必须为此付费 - 但我与他们的销售和支持团队互动的经验非常丰富。如果你最终获得许可,请帮我一个忙,让他们知道来自 Gratis 的 Daniel 派你来的;)
【讨论】:
【参考方案2】:我会选择 memcached。您可以在每个 Web 服务器上设置它,然后您可以使用您添加的每个新 Web 服务器对其进行扩展。我之前在 codeplex 上发现过几个客户。
【讨论】:
Memcached 真的会保持服务器场中的节点同步吗?为了防止单点故障,它们需要保持同步,以便在添加或删除项目时,所有节点都会收到通知。 是的,memcached 中的 d 代表分布式,因此它会在集群中的所有节点之间同步信息。 啊!那么,ASP.NET 状态服务器可以与 Memcached 互换! ***.com/questions/290966/… 我担心 Memcached 不会让节点保持同步.. 你确定吗?来自网站“Memcached 是您的应用程序的缓存层。它的设计初衷是没有任何数据冗余。” code.google.com/p/memcached/wiki/FAQ#How_is_memcached_redundant? 我认为这里有些混乱。 memcached 将在您提供的尽可能多的服务器上分发哈希表,但这意味着您推送到数组中的任何键都将仅存在于单个服务器上,因此 d.如果该服务器因任何原因而死亡,则密钥将随之死亡,并且对该密钥的获取将返回空白。虽然我仍然认为这是扩展会话存储的绝佳解决方案:)【参考方案3】:您正在寻找一种分布式缓存技术。 Microsoft Velocity 是一个由 Microsoft 发布的示例,用于将默认 ASP.NET 会话状态替换为可以分发的 Velocity。还有其他缓存提供程序,例如 Memcache。
编辑:更新此答案以获取与当前时间更相关的信息,这种类型的功能内置于 Windows Azure 和 AppFabric 产品中。可以在此处查看有关此的一些简要信息:Windows Server and Azure AppFabric virtual launch May 20th
【讨论】:
Velocity 的问题在于它从未正式发布过。现在已经好几年了,我们只有CTP。我想知道您可以从 MS 获得什么支持?此外,Velocity 团队的博客已经相当长一段时间了,这让我想知道 MS 是否不会在不远的将来扼杀这个项目。 @Piotr Velocity 是作为 Azure 技术系列的一部分的 AppFabric 的前身,引用:hanselman.com/blog/…我更新了我的答案以包含这个【参考方案4】:只需少量代码和配置更改,即可轻松扩展 SQL 服务器上的会话数据库。您可以将 asp.net 会话粘贴到会话数据库中,并且无论场中的哪个 Web 服务器为请求提供服务,您的基于会话 ID 的 sql 状态服务器映射都可以完美运行。这可能是使用 SQL Server 横向扩展 ASP.NET 会话状态的最佳方法之一。欲了解更多信息,请阅读链接
True Scaleout model for session state
【讨论】:
【参考方案5】:你能做的最好的事情就是完全避开状态服务器。
真正扩展会话状态的唯一方法是完全避免依赖于会话存储后端(in-proc、sql、mongo 或其他)。
如果会话数据足够小以适合(通常在大多数应用程序中)在请求的标头中,则应将其保存在 cookie 中(已签名!)并随着请求本身来回移动。没有单点故障,没有扩展问题,无需调整内存或 CPU 要求。
JWT 是一个可以用于此的已知标准,这里的这篇文章指向一个基于 JWT 的 ASP.Net 会话状态提供程序:
http://www.drupalonwindows.com/en/content/aspnet-session-state-scaling-and-performance-issues
【讨论】:
以上是关于扩展 ASP.NET 会话状态服务器的主要内容,如果未能解决你的问题,请参考以下文章
在 Ajax 调用期间保持 ASP.Net 会话处于活动状态
POST 请求的 GENERAL_REQUEST_ENTITY 期间的错误导致 ASP .NET 会话状态永远不会被解锁