Моя команда в настоящее время создает новое SaaS-приложение для нашей компании ( Amilia.com ). Мы находимся в альфа-версии, и приложение было создано для развертывания в веб-ферме.
Для нашего поставщика сеансов мы используем режим Sql Server (в DEV и TEST), и он, кажется, не «масштабируемый», поэтому мы ищем лучшее решение для обработки сеансов в asp.net (mvc3 в нашем случае ). В настоящее время мы используем Sql Server, но мы хотели бы перейти на другую систему из-за стоимости лицензии.
Мы нацелены на 20 000 [РЕД., Было 100k раньше] одновременных пользователей. В сеансе мы храним GUID, строку и объект Cart (мы стараемся сохранить его как можно меньше, этот объект позволяет нам сохранять 3 запроса при каждом запросе).
Вот различные решения, которые я нашел:
Встроенные решения ASP.NET:
Нет сессии: невозможно в нашем случае (исключено)
Режим In-Proc: нельзя использовать в веб-ферме. (Устранено)
Режим StateServer: может использоваться в веб-ферме, но если сервер выходит из строя, я теряю все свои сеансы. (Устранено)
Режим StateServer с PartitionResolver с использованием нескольких серверов (http://msdn.microsoft.com/en-ca/magazine/cc163730.aspx#S8) Если я правильно пойму, если один из этих серверов выйдет из строя, только часть моих пользователей потеряет свой сеанс.
Режим SqlServer: может использоваться в веб-ферме, если сервер отключается, я могу восстановить свои сеансы, но процесс идет довольно медленно. Более того, эта база данных становится узким местом в случае большой нагрузки.
Режим 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 удваивает цену, мы немедленно удваиваем стоимость нашей инфраструктуры (но это уже другой вопрос).
Итак, как лучше или, по крайней мере, как вы относитесь к этому?