Mi equipo está actualmente creando una nueva aplicación SaaS para nuestra empresa (Amilia.com). Estamos en versión "alfa" y la aplicación fue desarrollada para implementarse en una granja de servidores web.ASP.NET MVC ¿Estado de sesión usando el particionamiento de estado, MongoDB o Memcached o ...?
Para nuestro proveedor de sesión, estamos utilizando el modo Sql Server (en DEV y TEST) y parece que no es "escalable", por lo tanto, estamos buscando la mejor solución para manejar sesiones en asp.net (mvc3 en nuestro caso). Actualmente estamos utilizando Sql Server, pero nos gustaría cambiar a otro sistema debido al costo de la licencia.
Nuestro objetivo es 20 000 [EDITADOS, era 100k antes] usuarios concurrentes. En sesión, almacenamos un GUID, una cadena y un objeto Cart (intentamos mantenerlo lo menos posible, este objeto nos permite guardar 3 consultas en cada solicitud).
Aquí están las diferentes soluciones que he encontrado: soluciones integradas
ASP.NET:
ninguna sesión: imposible en nuestro caso (eliminado)
en proceso Modo: puede no se usará en una webfarm. (eliminado)
Modo StateServer: se puede usar en una webfarm pero si el servidor se cae, pierdo todas mis sesiones. (eliminado)
Modo StateServer con un PartitionResolver usando varios servidores (http://msdn.microsoft.com/en-ca/magazine/cc163730.aspx#S8) Si lo entiendo bien, si uno de estos servidores falla, solo una parte de mis usuarios perderá su sesión.
Modo SqlServer: se puede utilizar en una webfarm, si el servidor se cae, puedo recuperar mis sesiones, pero el proceso es bastante lento. Además, esa base de datos se convierte en un cuello de botella en caso de carga pesada.
Modo SqlServer con PartitionResolver usando varios servidores (http://www.bulletproofideas.net/2011/01/true-scale-out-model-for-aspnet-session.html): Si uno de estos servidores falla, solo una parte de mis usuarios perderá su sesión. Si el usuario no estaba haciendo nada entre el tiempo de inactividad, recuperará su sesión anterior, de lo contrario será redirigido a la pantalla de inicio de sesión.
soluciones personalizadas:
Uso MongoDB como almacenamiento de sesión (http://www.adathedev.co.uk/2011/05/mongodb-aspnet-session-state-store.html), parece ser una buena solución de compromiso, pero mis conocimientos en nosql es bastante rudimentario, así que no puedo ver los contras.
Utilice Memcached: el problema será el mismo que el modo StateServer y si el servidor de memcached se cae, todas mis sesiones se pierden. Además, creo que Memcached no está dedicado a almacenar el estado de la sesión.
Usa memcached distribuido como ScaleOut (http://highscalability.com/product-scaleout-stateserver-memcached-steroids): parece ser la mejor solución pero cuesta dinero.
Use repcached y memcached (http://repcached.lab.klab.org/), nunca he visto una implementación de esa solución.
Podríamos ir fácilmente a la Sra. Azure y usar herramientas provistas, pero solo tenemos una aplicación, de modo que si Microsoft duplica el precio, duplicamos inmediatamente el costo de nuestra infraestructura (pero ese es otro tema).
Entonces, ¿cuál es la mejor manera o al menos cuál es tu opinión al respecto?
Gracias por la respuesta, muy interesante. De hecho, apuntamos a 5000 clientes para nuestra plataforma durante los próximos 2 años, cada cliente tiene alrededor de 300 usuarios. Para cada cliente, proporcionamos una plataforma de registro, los períodos de registro generalmente son al mismo tiempo para todos nuestros clientes (=> peeks).Como los artículos vendidos se agotaron en menos de 5 minutos, es difícil estimar la cantidad de "usuarios concurrentes". Al leerlo, tal vez sobreestimé nuestro objetivo. Dirigirse a 20K usuarios concurrentes parece más razonable. Para las sesiones, parece malo almacenar la sesión con Memcached. – dervlap
respuesta muy detallada e informativa! – ljubomir