2011-09-12 13 views
5

Tenemos un sistema que, dado un lote de solicitudes, realiza un número equivalente de llamadas a una API externa de terceros. Dado que se trata de una tarea enlazada de E/S, actualmente usamos un grupo de subprocesos en caché de tamaño 20 para atender estas solicitudes. Excepto lo de arriba, es la solución a:software/hardware de escalado para un gran número de solicitudes externas de API?

Uso menos máquinas con más núcleos (menos del contexto de conmutación, capaz de soportar más hilos concurrentes)

o

uso más máquinas aprovechando el hardware básico/barato (cajas de pizza)

El número de solicitudes que recibimos por día está en el orden de millones.

Estamos usando Java, por lo que los hilos aquí son núcleo, no "verde".

Puntos Otros/Pensamientos:

  • Hadoop se utiliza comúnmente para problemas de esta naturaleza, pero esto tiene que ser en tiempo real frente a la minería de datos en línea estereotipada.
  • Las solicitudes de API tomar de 200 ms y 2 segundos en promedio
  • No hay un estado compartido entre las peticiones
  • La tercera Parte en cuestión es capaz de dar servicio a más solicitudes de las que puede posiblemente el fuego (pagos a proveedores).
+0

¿Tiene estado compartido, usado para manejar solicitudes? Si es así, ¿con qué frecuencia está cambiando? ¿Cuál es el tamaño de este estado compartido? –

+1

¿Cuál es el límite en la API de terceros?No tiene sentido escalar tu pila si la API que llamas sigue siendo el cuello de botella. ¿Puede almacenar en caché los datos que recibe de él o utilizar los datos de una llamada al servicio/suministrar a muchos de sus clientes al mismo tiempo? – Paolo

+0

Edité mi publicación original para responder a las preguntas anteriores. Las llamadas son completamente independientes, por lo que no hay datos para almacenar en caché. – smonky

Respuesta

1

No es obvio para mí que necesita más recursos (máquinas más grandes o más máquinas). Si está hablando de un máximo de 10 millones de solicitudes en un día que toma como máximo 2 segundos cada una, eso significa:

  • ~ 110 solicitudes por segundo. Eso no es tan rápido. ¿Son las solicitudes particularmente grandes? ¿O hay grandes explosiones? ¿Estás haciendo un procesamiento pesado además de enviar a la API de terceros? Hasta ahora no me ha dado ninguna información que me lleve a pensar que no es posible ejecutar todo su servicio en un solo núcleo. (Llámelo tres de las máquinas más pequeñas posibles si desea tener redundancia n + 2)
  • en promedio, ~ 220 solicitudes activas. De nuevo, parece que no hay problema para una sola máquina, incluso con un modelo de subprocesos (por combinación) de subprocesos. ¿Por qué no amplías el tamaño de tu grupo y lo llamas un día? ¿Estos son realmente explosivos? (¿Y tienes unos requisitos de latencia/fiabilidad muy estrictos?) ¿Necesitan una gran cantidad de RAM mientras están activos?

¿Podría darnos más información sobre por qué cree que tiene que tomar esta decisión?

0

En lugar de utilizar una gran cantidad de subprocesos, puede que te vaya mejor con la E/S controlada por eventos usando node.js con las salvedades de que puede significar una gran reescritura y el hecho de que node.js es bastante reciente.

Esto SO article puede ser de su interés.

Cuestiones relacionadas