2009-09-14 15 views
8

Estoy construyendo un servicio web que estará bajo una carga ridícula (de miles a decenas de miles de consultas por segundo). Mi pila normal de Apache, PHP, Memcache y algunos DB podrán manejarlo con un buen balanceador de carga y muchas máquinas, pero me pregunto si hay mejores soluciones.Pila de tecnología de alta escalabilidad

El punto final será golpeado por una baliza (a través de javascript en el cliente), leeré las cookies del usuario, extraeré alguna pequeña información del DB, lo guardaré en caché, haré un pequeño cálculo, enviaré la respuesta y si es necesario, escriba en el DB e invalide el caché.

¿Y buenas opciones de tecnología y/o recomendaciones de hardware?

Respuesta

13

Este no es el tipo de pregunta que se puede responder aquí en otra cosa que no sea una descripción general. Algunos indicadores generales:

  • Hardware: las dos opciones son básicamente un montón de cajas, pequeños y baratos o menor número de cajas más potentes. Cajas más baratas son, bueno, más baratas, pero normalmente consumen mucha más energía para la misma CPU o memoria (lo que sea importante para usted) que las cajas más grandes. La gente a menudo se olvida del costo a veces significativo del consumo de energía;
  • Backend: tiene algunas opciones desde el extremo grande de la ciudad (Oracle, SQL Server) hasta el extremo comodín (MySQL). MySQL es obviamente más barato y puede llegar lejos en MySQL, pero no hay duda de que Oracle (con el que estoy más familiarizado que SQL Server) tiene un mejor optimizador, es más capaz y es más robusto que MySQL. Sin embargo, pagarás por ello;
  • Presupuesto: este es un factor muy importante ya que podría valer la pena pagar por un buen software comercial en lugar de pagar los costos de desarrollo para usar software "gratuito". El desarrollo de software es uno de los costos más costosos de todos;
  • Escalabilidad vertical y horizontal: la pregunta que básicamente está tratando de responder aquí es la acumulación (cajas más grandes, etc.) o la construcción (entornos agrupados). Las soluciones más escalables tienen una escalabilidad horizontal casi lineal pero a corto plazo la escalabilidad vertical puede ser más económica.

En cuanto a su stack normal, me quedaré con él a menos que tenga un requisito particular que no haya mencionado que lo prohíba. Después de todo, PHP es una tecnología comprobada que tiene 4 o más de los 20 mejores sitios en Internet (Facebook, Wikipedia, Flickr y yo creo que Yahoo). Si es lo suficientemente bueno para ellos, es lo suficientemente bueno para ti.

Lo que es más importante, ya lo sabes. La tecnología apila usted sabe pilas de tecnología trump que no en casi todos los casos. Tenga cuidado con la trampa de "pastos más verde" de la última pila de tecnología exagerada.

Memcache es bueno. La otra cosa que podría considerar agregar a la mezcla es beanstalkd como un procesador distribuido de colas de trabajos.

Una pregunta importante que debe responder es: ¿qué tan bien puede particionar su aplicación? Las aplicaciones que se prestan fácilmente a la partición son mucho más fáciles de escalar. Aquellos que no son tienden a ser modificados de alguna manera para que sean más fáciles de particionar.

Un buen ejemplo de esto es una aplicación de intercambio simple.Puede dividir la información del mercado en función del código de existencias (A-C en un servidor, D-F en otro, etc.). Para muchas de esas aplicaciones que funcionarán bien.

5

http://highscalability.com/ hay mucho que aprender aquí, probablemente encontrará su respuesta.

+1

Mi objetivo no es un gran sistema escalable, solo una simple tecnología. No estoy creando una base de datos, Búsqueda, rastreador, etc. Solo una simple solicitud, consulta, responde y almacena. ¿Alguna recomendación para la tecnología apilada para mi propósito? –

+0

Por lo que he visto, puedes construir un sistema escalable con cualquier pila de tecnología. "De miles a diez- miles de consultas por segundo "es realmente alto, por lo que para mí es un" gran sistema escalable ". Cualquier acumulación de tecnología tiene su historia de éxito. Si desea soportar este cargo, debe leer este sitio web (y tal vez considere usar un clave/valor almacenar como CouchDB en lugar de una base de datos relacional) –

0

PHP, memcached + DB en general, escala bien, pero puede haber maneras de hacerlo con menores costos, es decir, una pila que puede manejar más solicitudes concurrentes por máquina.

Dada su comentario aquí ...

Mi objetivo no es un sistema escalable grande, sólo un simple conjunto de tecnología. No estoy creando una base de datos, una búsqueda, un rastreador, etc. Solo una simple solicitud, consulta, responde y almacena. ¿Alguna recomendación para la tecnología apilada para mi propósito?

.. parece que la parte de la base de datos puede ser solucionada por Amazon's S3 ([¿qué?!?] [1]), suponiendo que solo necesita localizar elementos por clave. Eso también le daría Cloudfront para lecturas, si no le importa el eventual consistency.

Mientras que algo del lado del servidor que usa async IO para manejar las solicitudes debe aumentar significativamente el número de solicitudes concurrentes que cada máquina puede manejar. Como otro cartel ya dijo tornado (bret.appspot.com/entry/tornado-web-server) valdría la pena echarle un vistazo aquí - no he visto una API para async IO que sea más amigable.

Es probable que todavía necesite memcached para mantener las lecturas rápidas, pero desea ver que el cliente de memcached no va a terminar bloqueando el proceso del servidor mientras intenta hacer solicitudes concurrentes - PHP normalmente no tendría este problema ya que cada proceso PHP (o Apache) tiene su propia conexión memcached y solo está haciendo una cosa a la vez. This python client - debe admitir async IO - la libmemcached subyacente tiene soporte para solicitudes asincrónicas.

Lo mismo ocurre con las solicitudes HTTP del servidor a S3. ¿Cómo maneja las solicitudes simultáneas allí? boto parece usar un grupo de conexiones para eso, cada conexión tiene un socket diferente abierto. ¿Uso de memoria?

Descargo de responsabilidad: Estoy siendo un arquitecto de sillón aquí - en realidad no he hecho esto y el consejo más inteligente podría ser terminar el proyecto a tiempo con la pila que conoces bien y que no van a fallar.

Lo sentimos acerca de los vínculos

[1] - http://www.nektoon.com/t/1Z99Daaa

1

También puede considerar el uso de BigPipe para aumentar su rendimiento. Facebook también lo usa masivamente y esto es lo que dicen al respecto: "Para explotar el paralelismo entre el servidor web y el navegador, BigPipe divide primero las páginas web en múltiples fragmentos llamados pagelets. Así como un microprocesador de canalización divide el ciclo de vida de una instrucción en múltiples etapas (como "búsqueda de instrucciones", "decodificación de instrucciones", "ejecución", "registro de escritura", etc.), BigPipe divide el proceso de generación de páginas en varias etapas:

Análisis de solicitudes: análisis del servidor web y la cordura comprueba Solicitud HTTP Recuperación de datos: el servidor web obtiene datos del nivel de almacenamiento Generación de marcado: el servidor web genera etiquetas HTML para la respuesta. Transporte de red: la respuesta se transfiere desde el servidor web al navegador. Descarga CSS: descargas del navegador CSS requerido por la página. Construcción de árbol DOM y estilo CSS: el navegador construye el árbol DOM del documento y luego aplica las reglas CSS sobre él. Descarga de JavaScript: descargas del navegador Recursos de JavaScript a los que hace referencia la página. Ejecución de JavaScript: el navegador ejecuta el código JavaScript de la página.

Las tres primeras etapas son ejecutadas por el servidor web, y las últimas cuatro etapas son ejecutadas por el navegador. Cada página debe pasar por todas estas etapas de forma secuencial, pero BigPipe permite que se ejecuten varias páginas simultáneamente en diferentes etapas. "