¿Cómo diseñas un backend web que minimiza la latencia? Estoy construyendo un servicio en la nube para servir al internet público.

Contestaré esto dando una serie de mejores prácticas para tener en cuenta.

Elige el idioma correcto

Los lenguajes de script no necesitan aplicarse. Si bien se vuelven cada vez más rápidos cuando busca reducir milisegundos su tiempo de procesamiento, no puede tener la sobrecarga de un lenguaje interpretado. Además, querrá un modelo de memoria fuerte que permita la programación libre de bloqueos, por lo que realmente debería considerar Java, C ++ 11 o Go.

Mantenlo todo en RAM

I / O matará su latencia, asegúrese de que todos sus datos estén en RAM. Esto podría significar simplemente usar en la memoria estructuras de datos con una forma de reconstruirlas en la máquina o reiniciar el proceso. También podría significar usar un almacén de datos en memoria como redis, memcache o voltdb. Finalmente, podría significar usar un almacén de datos basado en disco (MongoDB, MySQL, PosgreSQL, etc.) y ejecutarse en hardware donde hay significativamente más RAM que datos.

Mantenlo todo en un host

Los saltos de red son más rápidos que el disco, pero aun así agregarán mucha sobrecarga. Si es posible, mantenga todos los cálculos ubicados junto con los datos.

Mantenga el sistema infrautilizado

La baja latencia requiere tener siempre recursos para procesar la solicitud. No intente ejecutar al límite de lo que su hardware / software puede proporcionar. Siempre tenga mucho espacio para la cabeza y algo más.

Solo tantos hilos como núcleos y mantenga los hilos anclados a núcleos individuales

Querrá reducir los cambios de contexto no solo porque toman tiempo sino porque hará un uso ineficiente de su caché L1 / L2. Cuando tiene un subproceso por núcleo y está anclado a ese núcleo, aprovecha al máximo su caché L1 / L2. La memoria es un cuello de botella y el caché es la forma de evitarlo.

E / S secuencial por lotes

Esto suena contradictorio, pero en realidad tendrá una mejora significativa en el rendimiento si agrupa su E / S, ya que casi todas las E / S, desde redes hasta husillos, SSD e incluso RAM, funcionan mejor con lecturas y escrituras secuenciales más grandes en lugar de muchas pequeñas lecturas y escrituras aleatorias. En lugar de realizar un procesamiento por lotes basado en un tiempo arbitrario, puede tener un hilo en un bucle que realiza E / S que escribe tantos datos como han llegado mientras espera que regrese la escritura anterior. Esto lo convierte en un sistema muy rápido y adaptable.

No bloquear tanto como sea posible

Haz amigos sin bloqueo y espera estructuras de datos y algoritmos gratuitos. Cada vez que usa un bloqueo, debe bajar la pila al sistema operativo para mediar el bloqueo, que es una gran sobrecarga. A menudo, si sabe lo que está haciendo, puede sortear los bloqueos si comprende el modelo de memoria de JVM, C ++ 11 o Go.

Asíncrono tanto como sea posible

Cualquier procesamiento y particularmente cualquier E / S que no sea absolutamente necesario para construir la respuesta debe hacerse fuera del camino crítico de construir la respuesta.

Paralelo tanto como sea posible

Cualquier procesamiento y particularmente cualquier E / S que pueda ocurrir en paralelo debe hacerse en paralelo. Por ejemplo, si su estrategia de alta disponibilidad incluye registrar transacciones en el disco y enviar transacciones a un servidor secundario, esas acciones pueden ocurrir en paralelo. Tenga cuidado de adherirse a la regla asíncrona tanto como sea posible, así como a la regla de E / S secuencial por lotes cuando trabaje con E / S y mantenga el sistema infrautilizado y solo use tantos hilos como reglas de núcleos al paralelizar no E / S tratamiento.

Recursos

Casi todo esto proviene de seguir lo que LMAX está haciendo con su proyecto Disruptor. Lea sobre eso y siga todo lo que Martin Thompson hace.

  • Disruptor por LMAX-Exchange
  • La arquitectura LMAX
  • Simpatía mecánica
  • Mala concurrencia
  • disruptor
  • disruptor

Blogs adicionales

  • Java es la nueva C
  • Psicosomática, lobotomía, sierra
  • Preshing en la programación
  • Vainilla #Java
  • Página en 1024cores

Shoutouts

Gracias a Cameron Purdy por el comentario a continuación.

Actualizar

He publicado una versión extendida y actualizada de esta respuesta aquí: http://codedependents.com/2014/0…

Puedes intentar:

Componentes sueltos

Use interfaces asincrónicas para que pueda agregar latencia cuando necesite hacer cambios.

Usar escala horizontal

Cree una arquitectura activa Para que todos sus datos se operen simultáneamente y los usuarios puedan recibir los datos más cercanos.

Use un modelo de almacenamiento compartido suave Para que pueda asegurarse de que su web tenga buena consistencia y disponibilidad. En este caso, no necesita coordinar una transacción en varios servidores de bases de datos.

Además, si desea verificar el borrador general de su diseño web, puede probar un software de diagrama de arquitectura web

Creo que la respuesta de Ben es excelente, pero se centra más en una arquitectura monolítica. IOW, cuando comienzas a obtener un mayor número de solicitudes simultáneas, comienzas a obtener latencias más altas sin culpa tuya ¿O es tu culpa?

Si necesita un sistema que mantenga su latencia bajo control, debe tener algún tipo de sistema distribuido, como la arquitectura de microservicios. En ese sistema deberías tener:

  • Solicitudes concurrentes a módulos independientes de su agregador.
  • Una forma eficiente de comunicación entre procesos.
  • Un sistema que activa alarmas al exceder el umbral de latencia.
  • Un sistema eficiente de autenticación y gestión de sesiones para que el usuario no pierda tiempo en cada solicitud.
  • Almacenamiento en caché multicapa en cliente, agregado y microservicios.
  • Escalado automático, para que su sistema se escale automáticamente en latencias más altas.
  • Un buen sistema de tolerancia a fallas para que el usuario no siga esperando si alguno de sus componentes funcionales se está demorando en responder.

He escrito un artículo detallado sobre el diseño de tales sistemas desde cero si este tipo de cosas te interesan.

Diseño de infraestructuras de backend escalables desde cero

La clave para tener la latencia más baja (y alta escalabilidad) es hacer la menor cantidad de trabajo por ejecución.

More Interesting

¿Estoy cometiendo un error al no informar a ninguno de mis profesores de CS sobre mi próxima muestra de codificación de Google (prueba en línea)?

¿Las personas que se burlan de PHP reconsideran su punto de vista cuando compañías como Slack envían aplicaciones en tiempo real muy exitosas hechas con PHP?

¿Qué es el desarrollo de software y cómo puedo comenzar a aprenderlo?

Cómo enseñar a mis socios comerciales sobre sprints

¿Sería atractivo tener experiencia en desarrollo web si solicita el curso de ingeniería de software en el Imperial College de Londres?

¿Por qué es tan importante la inmutabilidad en el desarrollo de software?

¿Cuáles serían los requisitos de software para desarrollar un software de cubo de rubik?

Tengo un descanso de verano de 3 meses. Durante este tiempo, quiero aprender la estructura de datos y los algoritmos para poder manejar entrevistas técnicas y también obtener una buena clasificación en la programación competitiva. ¿Cómo debo prepararme para alcanzar mis metas?

¿Cómo se puede extraer el contenido textual principal de una lista de sitios heterogéneos sin conocer de antemano la estructura de la página?

¿Qué oportunidades traerá el nuevo sistema operativo de Google, Fuchsia, para los desarrolladores de aplicaciones móviles?

¿Cuáles son algunas buenas ideas para proyectos de ingeniería de software, preferiblemente con Java, JavaScript, PHP o en Android?

¿El software MuleSoft Anypoint es propietario?

¿Qué software se usa para crear programas?

¿Cuánto tiempo deben durar los períodos de garantía sin errores en el desarrollo de un nuevo software?

¿Cuáles son los conceptos que necesito cubrir antes de ir a una prueba de selección para un puesto de ingeniero de software?