ASP.NET 以开发高流量的 Web 应用程序而闻名。 其中许多应用程序部署到多个地理位置。 这种多站点部署既可以用于灾难恢复,也可以通过让 ASP.NET 应用程序更靠近最终用户来处理区域流量。
在灾难恢复的情况下,通常有一个主动站点和一个被动站点。 一旦活动站点因任何原因关闭,被动站点就会变为活动站点。 在其他情况下,两个或更多站点可能都处于活动状态,但处理的流量更接近其区域(例如,纽约、伦敦和东京)。
NCache 更多信息 NCache 配套文档 ASP.NET 会话状态提供程序
ASP.NET 将用户特定的信息保存在 Web 服务器上的 Session State 对象中。 当用户第一次访问 ASP.NET 应用程序时,它的会话状态被创建并且只要用户正在使用该应用程序就一直保持在那里。 默认情况下,在用户不活动 20 分钟后,ASP.NET 会过期此会话。
ASP.NET 会话状态对象存储在 Web 服务器 (InProc)、任何服务器 (StateServer) 上的内存中、SQL Server 数据库中或使用 SSP 体系结构的第三方存储中。
第三方选项通常是内存中的分布式缓存,例如 NCache,是存储会话状态的好地方。 原因是由于会话复制,ASP.NET 会话状态具有更快的性能、更大的可伸缩性和更好的可靠性。 下面是如何在 web.config 文件中指定自定义会话存储选项的示例,这会导致 NCache 作为 ASP.NET 会话状态存储:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<sessionState cookieless ="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="NCacheSessionProvider" timeout="60" sessionIDManagerType="Alachisoft.NCache.Web.SessionStateManagement.CustomSessionIdManager, Alachisoft.NCache.SessionStateManagement"> <providers> <add name ="NCacheSessionProvider" type="Alachisoft.NCache.Web.SessionState.NSessionStoreProvider" sessionAppId="demoApp" cacheName="demoClusteredCache" writeExceptionsToEventLog="false" asyncSession="false" enableLogs="false"/> </providers> </sessionState> |
主动-被动多站点部署
但是,如果您的应用程序在多站点部署中运行,那么您必须解决的问题是如何处理 ASP.NET 会话 状态存储。 如果您已经在主动-被动多站点配置中部署了 ASP.NET 应用程序,那么您的所有 ASP.NET 会话状态都将被创建并存储在活动站点中。 被动站点没有任何会话数据。 因此,如果活动站点出现故障并且所有流量都重定向到被动站点,所有用户将突然失去他们的会话并不得不重新开始。 您可以通过使用 NCache 桥接拓扑。
创建一个 桥 在主动和被动站点之间,主动站点开始向桥提交所有添加、更新和删除 ASP.NET 会话状态对象。 网桥通过 WAN 将它们异步复制到被动站点。 Bridge 架构不会阻止活动站点操作,因此您不会看到任何性能下降。 您必须记住的唯一问题是,由于 Bridge 异步复制,如果活动站点突然关闭,“复制队列”中可能会有一些会话无法到达被动站点。 但这通常是一个微不足道的数字。 阅读更多关于 NCache 桥接拓扑 以及对您有益的所有情况。
NCache 更多信息 NCache 配套文档 ASP.NET 会话状态提供程序属性
主动-主动多站点部署
如果您的 ASP.NET 应用程序同时部署到两个或多个活动站点,那么您应该避免复制 ASP.NET 会话状态 到所有站点以节省带宽成本。 但是,您可能希望能够将一些流量路由到其他站点以处理溢出情况。
或者,您可能需要关闭其中一个站点进行维护,而不会对用户造成任何干扰。 在这种情况下,您可以使用多站点 ASP.NET 会话状态存储功能 NCache. 该功能允许您处理这些情况并在 web.config 中指定为该会话的“主”站点生成带有位置前缀的会话 ID。 然后,即使此会话请求路由到另一个站点,该站点也知道在哪里可以找到此会话。
即使用户请求到另一个站点的路由,会话也不会从它们的主要位置移动。 但其他站点可以从其“主”站点访问此会话。 每个站点都将其“主要”站点和所有其他站点指定为“辅助”站点。 以下是您为实现此目标而采取的步骤:
- 在 web.config 中添加条目。 需要在所有服务器和站点上以相同的方式生成 ASP.NET 会话 ID。 您可以使用 genmackeys 实用程序 NCache 安装以生成密钥。
1<machineKey validationKey ="A01D6E0D1A5D2A22E0854CA612FE5C5EC4AECF24"decryptionKey ="ACD8EBF87C4C8937" validation ="SHA1"/> - 要启用 session-id 的位置亲和性,请添加下面提到的配置:
123456<configSections><section name="ncache" type="Alachisoft.NCache.Web.SessionStateManagement.NCacheSection,Alachisoft.NCache.SessionStateManagement, Version=x.x.x.x, Culture=neutral, PublicKeyToken=CFF5926ED6A53769"/></configSections><ncache><sessionLocation><primaryCache id="London_Cache" sid-prefix="LDNC"/><secondaryCache id="NewYork_Cache" sid-prefix="NYKC"/><secondaryCache id="Tokyo_Cache" sid-prefix="TKYC"/></sessionLocation></ncache> - 使用 web.config 中 sessionState 元素的 sessionIDManagerType 属性指定自定义会话 ID 管理器。
12345678910111213141516171819202122232425262728293031<<sessionStatecookieless ="false"regenerateExpiredSessionId="true"mode="Custom"customProvider="NCacheSessionProvider"timeout="60" sessionIDManagerType="Alachisoft.NCache.Web.SessionStateManagement.CustomSessionIdManager, Alachisoft.NCache.SessionStateManagement"><providers><add name ="NCacheSessionProvider"type="Alachisoft.NCache.Web.SessionState.NSessionStoreProvider"sessionAppId="demoApp"cacheName="demoClusteredCache"writeExceptionsToEventLog="false"asyncSession="false"enableLogs="false"/></providers></sessionState>
请注意,在上面的示例中,每个站点中的部分会有所不同,这意味着每个站点都有自己的“主要”站点,并将所有其他站点视为“次要站点”。
NCache 更多信息 NCache 配套文档 ASP.NET Core 会议
ASP.NET 以特定格式生成 sid(会话 ID),以便 sid 前缀可以是会话 ID 的一部分。 此会话 ID 帮助 ASP.NET 了解 ASP.NET 会话状态的来源,以便访问该站点的缓存。 使用此配置,如果您将任何请求从一个站点路由到另一个站点以进行溢出,则另一个站点会从其原始“主”站点获取 ASP.NET 会话状态,因为这是作为位置前缀的会话 ID 的一部分。 它最大限度地减少了您的 WAN 带宽消耗,您只需为溢出流量付费。
另一种情况是当您想要关闭网站时。 您可以将站点的所有流量重定向到其他站点,而无需关闭该站点的缓存服务器; 您可以关闭 Web 服务器。 然后等待所有现有的 ASP.NET 会话状态对象在其用户停止使用应用程序后过期。 一旦流量重定向,只需关闭缓存服务器。 有了这个,您的用户将不会感到任何停机时间。 看看如何 NCache 帮助您实现这一目标。 下载完整的 60 天试用版 NCache.