Моя команда в настоящее время строит новое приложение SaaS для нашей компании (Amilia.com). Мы находимся в выпуске "alpha", и приложение было создано для развертывания на веб-ферме.
Для нашего провайдера сеансов мы используем режим Sql Server (в DEV и TEST) и, похоже, не "масштабируемы", поэтому мы ищем лучшее решение для обработки сеансов в asp.net(mvc3 в нашем случае). В настоящее время мы используем Sql Server, но мы хотели бы переключиться на другую систему из-за стоимости лицензии.
Мы нацеливаем 20 000 [EDITED, было 100k до] одновременных пользователей. В сеансе мы храним GUID, строку и объект Cart (мы стараемся как можно меньше сохранить этот объект, который позволяет нам сохранять 3 запроса при каждом запросе).
Вот различные решения, которые я нашел:
Встроенные решения ASP.NET:
Нет сеанса: невозможно в нашем случае (исключено)
Режим In-Proc: не может использоваться в webfarm. (Устранено)
Режим StateServer: может использоваться в webfarm, но если сервер опускается, я теряю все свои сеансы. (Устранено)
Режим StateServer с PartitionResolver с использованием нескольких серверов (http://msdn.microsoft.com/en-ca/magazine/cc163730.aspx#S8) Если я правильно понял, если один из этих серверов опустится, только часть моих пользователей будет теряют свою сессию.
Режим SqlServer: может использоваться в webfarm, если сервер опускается, я могу восстановить свои сеансы, но процесс довольно медленный. Более того, эта база данных становится узким местом в случае большой нагрузки.
Режим SqlServer с PartitionResolver с использованием нескольких серверов (http://www.bulletproofideas.net/2011/01/true-scale-out-model-for-aspnet-session.html). Если один из этих серверов опускается, только часть моих пользователей потеряет сессию. Если пользователь ничего не делал между простоями, он восстановит свою предыдущую сессию, иначе он будет перенаправлен на экран ввода.
Пользовательские решения:
Используйте MongoDB как хранилище сеансов (http://www.adathedev.co.uk/2011/05/mongodb-aspnet-session-state-store.html). Это хороший компромисс, но мои знания в nosql довольно рудиментарны, поэтому я не вижу недостатков.
Использование Memcached: проблема будет такой же, как в режиме StateServer, и если сервер memcached опустится, все мои сеансы будут потеряны. Кроме того, я думаю, что Memcached не предназначен для хранения состояния сеанса?
Используйте распределенный memcached, такой как ScaleOut (http://highscalability.com/product-scaleout-stateserver-memcached-steroids): это лучшее решение, но оно стоит денег.
Использовать repcached и memcached (http://repcached.lab.klab.org/), я никогда не видел реализации этого решения.
Мы могли бы легко перейти к Ms Azure и использовать предоставленные им инструменты, но у нас есть только одно приложение, поэтому, если Microsoft удваивает цену, мы сразу удваиваем стоимость нашей инфраструктуры (но это еще одна тема).
Итак, какой лучший способ или, по крайней мере, ваше мнение об этом?