¿Cuál es la arquitectura ideal para una API que necesitará manejar miles de solicitudes por segundo?

El servidor (s) que acepta las solicitudes de API no puede ser sincrónico en el procesamiento de solicitudes, ya que solo puede atender de unos cientos a un par de miles de solicitudes por segundo con dicha arquitectura. (Incluso si sus servidores API están al frente de un equilibrador de carga, el rendimiento de la solicitud por servidor todavía sufre con un procesamiento sincrónico). Por lo tanto, debe buscar alguna forma de arquitectura asincrónica. Esto es especialmente importante para los casos en que su servidor actúa como un cliente, ya que no desea esperar la solicitud hasta que obtenga los datos de los servicios posteriores. Según su descripción, parece que Node.js es una plataforma ideal para basar su arquitectura. Sin embargo, todavía está en desarrollo temprano, por lo que hay algún riesgo involucrado. He usado Jetty con soporte de continuación anteriormente (servlets asíncronos) con una concurrencia mucho más alta que la implementación del mismo (bueno, no el mismo conjunto de servlets; entiendes la idea) en Tomcat. Entonces, si estás en Java, esto es ciertamente algo que debes considerar. Jetty es bastante estable y funciona con Google App Engine (aunque, como muchos otros, Google lo habría modificado para satisfacer sus necesidades, pero la arquitectura básica es bastante buena), por lo que está listo para la producción. No he usado Tornado, pero si estás en Python, deberías evaluar eso. Es uno de los llamados servidores C10K (http://en.wikipedia.org/wiki/C10…), por lo que debería ser bueno. Personalmente evaluaría node.js y haría una evaluación de riesgos antes de embarcarme en cualquier otro debido a su elegancia arquitectónica.

También debe considerar que sus servidores no tienen estado. Por lo tanto, cualquier solicitud de API puede ser manejada por cualquier servidor disponible sin ninguna afinidad. Por lo general, las sesiones de usuario se anclan a un servidor para que pueda almacenarse en caché y así sucesivamente, pero eso funcionaría negativamente cuando necesite admitir una gran cantidad de sesiones simultáneas.

Debe usar la agrupación de conexiones para solicitudes posteriores Esto minimizará la sobrecarga de creación / destrucción de conexión para cada solicitud de cliente. Es posible que deba implementar mecanismos de agrupación separados para diferentes protocolos (TCP, HTTP). Para Java, puede buscar Apache MINA.

Para solicitudes anteriores, Tomcat puede ser una solución decente. Para el equilibrio de carga, puede usar el conector Apache Tomcat.
http://tomcat.apache.org/connect… .