【问题标题】:Handling MVC Session State on Multi-Server Production Environment在多服务器生产环境中处理 MVC 会话状态
【发布时间】:2017-04-27 04:05:09
【问题描述】:

因此,我作为开发人员的第一份生产工作开始为一家公司工作,当时我正在编写 MVC Web 应用程序。对于某些数据,我们不希望有任何持久存储,因此只需将其保持在会话中即可。我刚刚完成了生产环境的设置,以便我们可以自动部署到服务器。

我以滚动部署的方式这样做。从一台机器上排干连接,将其关闭,部署新代码,将其重新启动,然后执行下一台机器。

从我的第一次测试来看,这似乎会杀死会话数据,这正是我所担心的。当用户切换机器时,IIS 中有没有一种方法可以传输会话数据,或者我是否需要某种共享文件存储来恢复,以防用户必须从机器上移除才能加载新代码。

我将 Big-Ip 用于我的负载平衡器,它会消耗资源,我认为它不一定了解 IIS。首次体验生产级部署的复杂性,无需停机。我想,如果有必要,我需要一个文件存储备份来“恢复”。只是想确保我没有遗漏任何东西。

【问题讨论】:

  • 我之前参与的一个项目使用了负载均衡器,我们必须启用粘性会话,以便一旦用户连接到盒子,那么该用户将始终被分配到该盒子。任何重定向到另一台机器,会话数据将不可用于进程内。如果您使用的是状态服务器(数据库),那么这将适用于任意数量的机器。

标签: asp.net-mvc session iis


【解决方案1】:

服务器场(即使只有两个)的最佳实践是不要将会话用于任何事情。除了 Session 会导致性能问题(Session 访问是序列化的,并且随着负载的增加会降低性能)之外,Session 也被认为是临时存储,并且可以随时消失。重新启动 IIS 应用程序池时,会话丢失(有意或无意)。此外,如果资源不足,IIS 甚至可以在会话过期之前转储会话。

会话基本上是不可预测的,也不可靠的。如果发现会话数据消失了,您在会话中放入的任何内容都应该可以从您的应用程序中重建。

当然,这是针对进程内会话的。您可以使用绑定到数据库的状态服务器,但这也会影响性能。特别是如果您大量使用会话。

一般而言,将您的应用设计为不使用会话,除非它是用于在不再找到时可以轻松重新创建的琐碎事物。

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2021-04-08
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多