ASP.NET MVC Session state using state partitioning, MongoDB или Memcached или...?

Моя команда в настоящее время строит новое SaaS-приложение для нашей компании (Amilia.com). Мы находимся в "альфа-релизе" и приложение было построено для развертывания на веб ферме.

Для нашего провайдера сеансов мы используем режим Sql Server (в DEV и TEST), и он, кажется, не "масштабируемый", поэтому мы ищем лучшее решение для обработки сеансов в asp.net (в нашем случае mvc3). В настоящее время мы используем Sql Server, но мы хотели бы перейти на другую систему из-за стоимости лицензии.

Мы нацеливаемся на 20 000 [EDITED, было 100k до] одновременных пользователей. В сессии мы храним GUID, строку и объект Cart (мы стараемся хранить его как можно меньше, этот объект позволяет нам сохранять 3 запроса при каждом запросе).

Вот различные решения, которые я нашел :

Встроенные решения ASP.NET:

Нет сеанса : невозможно в нашем случае (исключено)

In-Proc Mode : не может быть использовано в web-фарме. (eliminated)

StateServer Mode : может использоваться на веб-фарме, но если сервер выйдет из строя, я потеряю все свои сеансы. (eliminated)

StateServer Mode с помощью PartitionResolver, использующего несколько серверов (http://msdn.microsoft.com/en-ca/magazine/cc163730.aspx#S8) Если я хорошо распечатаю, если один из этих серверов выйдет из строя, только часть моих пользователей потеряет сеанс.

SqlServer Mode : может использоваться на веб-фарме, если сервер выйдет из строя, я могу восстановить свои сеансы, но процесс идет довольно медленно. Более того, эта база данных становится узким местом в случае большой нагрузки.

SqlServer Mode с PartitionResolver, использующим несколько серверов (http://www.bulletproofideas.net/2011/01/true-scale-out-model-for-aspnet-session.html) : Если один из этих серверов выйдет из строя, только часть моих пользователей потеряет свою сессию. Если пользователь ничего не делал между простоями, он восстановит свою предыдущую сессию, иначе он будет перенаправлен на экран регистрации.

Custom solutions :

Use MongoDB as Session storage (http://www.adathedev.co.uk/2011/05/mongodb-aspnet-session-state-store.html) Это кажется хорошим компромиссом, но мои знания в nosql довольно примитивны, так что я не могу увидеть недостатки (

Use Memcached : проблема будет та же самая, что и в режиме StateServer, и если memcached сервер выйдет из строя, то все мои сессии будут потеряны. Более того, я думаю, что Memcached не предназначен для хранения состояния сеанса ?

Use distributed memcached like ScaleOut (http://highscalability.com/product-scaleout-stateserver-memcached-steroids) : кажется, это лучшее решение, но оно стоит денег.

Use repcached and memcached (http://repcached.lab.klab.org/), я никогда не видел реализации этого решения.

Мы могли бы легко обратиться к г-же Лазурь и использовать предоставляемые ею инструменты, но у нас есть только одно приложение, так что если Microsoft удвоит цену, мы сразу же удвоим стоимость нашей инфраструктуры (но это уже другая тема).

Итак, какой способ лучше или, по крайней мере, каково ваше мнение по этому поводу?

11
задан tereško 1 March 2013 в 00:15
поделиться