【发布时间】:2011-09-04 02:24:22
【问题描述】:
我的团队目前正在为我们公司 (Amilia.com) 构建一个新的 SaaS 应用程序。我们处于“alpha”版本,该应用程序是为部署在网络场上而构建的。
对于我们的会话提供者,我们使用 Sql Server 模式(在 DEV 和 TEST 中),它似乎不是“可扩展的”,因此我们正在寻找在 asp.net 中处理会话的最佳解决方案(在我们的例子中是 mvc3 )。我们目前正在使用 Sql Server,但由于许可成本,我们想切换到其他系统。
我们的目标是 20 000 [已编辑,之前是 10 万] 并发用户。在会话中,我们存储了一个 GUID、一个字符串和一个 Cart 对象(我们尽量减少它,这个对象允许我们在每次请求时保存 3 个查询)。
以下是我找到的不同解决方案:
ASP.NET 内置解决方案:
无会话:在我们的情况下是不可能的(已消除)
进程内模式:不能在网络农场中使用。 (消除)
StateServer 模式:可以在 webfarm 中使用,但如果服务器出现故障,我会丢失所有会话。 (消除)
带有 PartitionResolver 的 StateServer 模式使用多个服务器 (http://msdn.microsoft.com/en-ca/magazine/cc163730.aspx#S8) 如果我理解得很好,如果其中一个服务器出现故障,那么只有一部分用户会丢失他们的会话。
SqlServer 模式:可以在 webfarm 中使用,如果服务器出现故障,我可以恢复我的会话,但过程很慢。此外,在负载过重的情况下,该数据库会成为瓶颈。
具有使用多个服务器的 PartitionResolver 的 SqlServer 模式 (http://www.bulletproofideas.net/2011/01/true-scale-out-model-for-aspnet-session.html):如果其中一个服务器出现故障,我的用户中只有一部分会丢失他们的会话。如果用户在停机期间没有做任何事情,他将恢复他之前的会话,否则他将被重定向到登录屏幕。
自定义解决方案:
使用 MongoDB 作为 Session 存储 (http://www.adathedev.co.uk/2011/05/mongodb-aspnet-session-state-store.html) 这似乎是一个很好的折衷方案,但我对 nosql 的了解还很初级,所以我看不到缺点。
使用 Memcached :问题与 StateServer 模式相同,如果 memcached 服务器出现故障,我的所有会话都将丢失。此外,我认为 Memcached 并非专门用于存储会话状态?
使用像 ScaleOut (http://highscalability.com/product-scaleout-stateserver-memcached-steroids) 这样的分布式 memcached:似乎是最好的解决方案,但它需要花钱。
使用 repcached 和 memcached (http://repcached.lab.klab.org/),我从未见过该解决方案的实现。
我们可以很容易地去 Ms Azure 并使用它提供的工具,但我们只有一个应用程序,所以如果微软将价格翻倍,我们的基础设施成本就会立即翻倍(但这是另一个主题)。
那么,最好的方法是什么,或者至少您对此有何看法?
【问题讨论】:
标签: asp.net-mvc performance session scalability