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.
Mirar dbs NoSQL y 10k escribe un minuto son aproximadamente 165 escrituras por segundo. No es mucho. – Viktor
no había pensado en eso, ¿cuál es la más confiable que recomiendas? –
MongoDB para NoSQL. Si está utilizando MySQL use una tabla MyISAM. – Dex