2011-06-30 9 views
5

Escribo una aplicación de ruby ​​on rails y una de las características más importantes del sitio web es la votación en vivo. Esperamos totalmente recibir 10k solicitudes de votación en tan solo 1 minuto. Junto con otras solicitudes eso significa que podríamos estar recibiendo un montón de solicitudes.Manejo de cientos de solicitudes simultáneas en raíles

Mi idea inicial es configurar el servidor para utilizar Apache + phusion, sin embargo, para la votación en concreto estoy pensando en escribir un script php en un lado y para escribir/leer la información en memcached. Los datos solo deben persistir durante unos 15 minutos, por lo que escribir en la base de datos 10.000 veces en 1 minuto parece inútil. También debemos marcar la ip del usuario para que no vote dos veces, por lo que es muy complicado en memcached.

Si alguien tiene alguna sugerencia o idea para que esto funcione de la mejor manera posible, por favor ayuda.

+0

Mirar dbs NoSQL y 10k escribe un minuto son aproximadamente 165 escrituras por segundo. No es mucho. – Viktor

+0

no había pensado en eso, ¿cuál es la más confiable que recomiendas? –

+0

MongoDB para NoSQL. Si está utilizando MySQL use una tabla MyISAM. – Dex

Respuesta

7

Si está diseñando una aplicación para este tipo de afluencia masiva, tendrá que desmantelar los componentes esenciales de la misma al mínimo absoluto.

Usar una pila de rieles completa para ese tipo de intensidad no es realmente práctica ni necesaria. Sería mucho mejor construir una capa Rack muy delgada que maneje la votación al hacer llamadas directas a bases de datos, omitiendo incluso un ORM, básicamente siendo un contenedor alrededor de una declaración INSERT. Esto es algo que Sinatra y Sequel, que sirve como un eficiente generador de consultas, podrían ayudar.

También debe asegurarse de ajustar su base de datos correctamente, además de ejecutar muchas pruebas de carga contra ella para asegurarse de que funciona como se espera, con un margen saludable para una mayor carga.

Hacer 10,000 llamadas DB en un minuto no es un gran problema, cada llamada tomará solo una fracción de milisegundo en una pila ajustada correctamente. Memcached podría ofrecer un mayor rendimiento, especialmente si los resultados no son permanentes. Memcached tiene un operador de incremento atómico que es exactamente lo que está buscando cuando simplemente tabula los votos. Redis es también una tienda temporal muy capaz.

Otra idea es eliminar la BD por completo y escribir un proceso de servidor persistente que indique un protocolo simple basado en JSON. Eventmachine es ideal para unir estas cosas si estás comprometido con Ruby, al igual que NodeJS si estás dispuesto a crear un servidor de cuentas especializado en JavaScript.

Se pueden realizar fácilmente 10.000 operaciones en un minuto incluso en hardware modesto utilizando procesos de servidores especializados sin la sobrecarga de una pila de base de datos completa.

Simplemente tendrá que asegurarse de que su alcance esté muy bien definido para que pueda probar y abusar mucho de su implementación antes de implementarlo.

Ya que lo que usted está describiendo es decir, en el mismo núcleo, algo equivalente a una búsqueda de hash, el código es simplemente esencial:

contest = @contest[contest_id] 

unless (contest[:voted][ip]) 
    contest[:voted][ip] = true 
    contest[:votes][entry_id] += 1 
end 

Al ejecutar este varios cientos de miles de veces en un segundo es totalmente práctico, así que la única sobrecarga sería envolviendo una capa JSON alrededor de ella.

+1

gracias por la excelente respuesta. Probablemente probaré eventmachine y parece que Sinatra + Memcached sería realmente eficiente sin requerir demasiada codificación de trabajo adicional. El hecho es que esto es para una característica única, sin embargo, es un requisito tan elevado que necesita su propia solución. –

Cuestiones relacionadas