具有单个Web服务器的InProc与AppFabric会话状态

And*_*mas 9 session-state inproc appfabric appfabric-cache

我有一个ASP.Net MVC应用程序,它大量使用session来保存状态(包括大数据集合).目前,它托管在一个Web服务器上.会话设置为InProc的默认值.

出现了一个问题,即当许多用户在线时,应用程序会冻结某些用户.我想这是因为InProc会话不能很好地扩展,并且该进程只有很多可用内存.(如果内存需求超过可用内存会发生什么 - 它是否会换出磁盘?)

我有几个解决方案可以帮助实现可伸缩性.(a)Sql server会话状态; (b)配置会话状态以使用AppFabric缓存.第一个选项看起来是一个很好的解决方案,除了它会影响性能并要求存储的项目可序列化.

如何在单个Web服务器也用作缓存主机的环境中配置会话状态以使用AppFabric缓存(也称为Velocity)?在单一服务器环境中,这与InProc有何不同?这会提供比InProc更多的可扩展性和可用内存,还是基本上会达到相同的约束?

Sli*_*SFT 9

您最好为您的方案实现AppFabric Cache.随着系统的增长,您可以使用每个新的Web节点增加缓存服务器的数量 - 这是使用SQL Server无法轻松完成的,无需额外成本.SQL Server许可的成本远高于AppFabric - 它与Windows Server许可捆绑在一起.

SQL Server将提供的唯一好处是可恢复性,但是对于您所需要的,它可能是过度的.

请参阅相关的SO帖子讨论AppFabric Cache与SQL Server的会话.


至于AppFabric Cache与InProc ......

如果遇到内存限制,可以将AppFabric Cache放在另一台服务器上.你不能用InProc做到这一点.

以下是AppFabric Cache的其他一些其他好处:

  1. 支持本地缓存,以加快序列化/反序列化所涉及的检索成本.
  2. 针对缓存逐出和过期策略提供更精细的控制.
  3. 支持压缩会话内容以减少网络带宽.
  4. Blob模式与单项检索相比,可以改善大型对象的数据检索.
  5. 可以跨多个应用程序使用相同的会话状态存储(通过sharedId).