Las redes internas a menudo usan conexiones de 1 Gbps, o más rápido. Las conexiones o enlaces de fibra óptica permiten anchos de banda mucho más altos entre los servidores. Ahora imagine el tamaño promedio de una respuesta JSON de una API. ¿Cuántas de esas respuestas se pueden transmitir a través de una conexión de 1 Gbps en un segundo?
Realmente hagamos los cálculos. 1 Gbps es 131 072 KB por segundo. Si una respuesta JSON promedio es de 5 KB (¡lo cual es bastante!), Puede enviar 26 214 respuestas por segundo a través del cable con solo un par de máquinas . No está tan mal, ¿no?
Es por eso que la conexión de red no suele ser el cuello de botella.
Otro aspecto de los microservicios es que puede escalar fácilmente. Imagine dos servidores, uno que aloja la API y otro que la consume. Si alguna vez la conexión se convierte en el cuello de botella, simplemente agregue otros dos servidores y podrá duplicar el rendimiento.
Esto es cuando nuestras 26 214 respuestas por segundo anteriores se vuelven demasiado pequeñas para la escala de la aplicación. Agrega otros nueve pares y ahora puede atender 262 140 respuestas.
Pero volvamos a nuestro par de servidores y hagamos algunas comparaciones.
Si una consulta promedio no almacenada en caché a una base de datos tarda 10 ms., Está limitado a 100 consultas por segundo. 100 consultas. 26 214 respuestas. Lograr la velocidad de 26 214 respuestas por segundo requiere una gran cantidad de almacenamiento en caché y optimización (si la respuesta realmente necesita hacer algo útil, como consultar una base de datos; las respuestas de estilo "Hola Mundo" no califican).
En mi computadora, en este momento, DOMContentLoaded para la página de inicio de Google sucedió 394 ms. después de que se envió la solicitud. Eso es menos de 3 solicitudes por segundo. Para la página de inicio de Programmers.SE, sucedió 603 ms. después de que se envió la solicitud. Eso no es ni siquiera 2 solicitudes por segundo. Por cierto, tengo una conexión a Internet de 100 Mbps y una computadora rápida: muchos usuarios esperarán más.
Si el cuello de botella es la velocidad de la red entre los servidores, esos dos sitios podrían literalmente hacer miles de llamadas a diferentes API mientras sirven la página.
Esos dos casos muestran que la red probablemente no será su cuello de botella en teoría (en la práctica, debe hacer los puntos de referencia y los perfiles reales para determinar la ubicación exacta del cuello de botella de su sistema particular alojado en un hardware en particular). El tiempo dedicado a hacer el trabajo real (serían consultas SQL, compresión, lo que sea) y enviar el resultado al usuario final es mucho más importante.
Piensa en bases de datos
Por lo general, las bases de datos se alojan por separado de la aplicación web que las usa. Esto puede plantear una preocupación: ¿qué pasa con la velocidad de conexión entre el servidor que aloja la aplicación y el servidor que aloja la base de datos?
Parece que hay casos en los que, de hecho, la velocidad de conexión se vuelve problemática, es decir, cuando almacena grandes cantidades de datos que no necesitan ser procesados por la base de datos y que deberían estar disponibles en este momento (es decir, archivos binarios grandes). Pero tales situaciones son raras: en la mayoría de los casos, la velocidad de transferencia no es tan grande en comparación con la velocidad de procesamiento de la consulta en sí.
Cuando la velocidad de transferencia realmente importa es cuando una empresa aloja grandes conjuntos de datos en un NAS, y varios clientes acceden al NAS al mismo tiempo. Aquí es donde una SAN puede ser una solución. Dicho esto, esta no es la única solución. Los cables Cat 6 pueden soportar velocidades de hasta 10 Gbps; La unión también se puede utilizar para aumentar la velocidad sin cambiar los cables o adaptadores de red. Existen otras soluciones, que implican la replicación de datos en múltiples NAS.
Olvídate de la velocidad; pensar en la escalabilidad
Un punto importante de una aplicación web es poder escalar. Si bien el rendimiento real es importante (porque nadie quiere pagar por servidores más potentes), la escalabilidad es mucho más importante, ya que le permite lanzar hardware adicional cuando sea necesario.
Si tiene una aplicación no particularmente rápida, perderá dinero porque necesitará servidores más potentes.
Si tiene una aplicación rápida que no puede escalar, perderá clientes porque no podrá responder a una demanda creciente.
Del mismo modo, las máquinas virtuales fueron percibidas hace una década como un gran problema de rendimiento. De hecho, alojar una aplicación en un servidor frente a alojarla en una máquina virtual tuvo un importante impacto en el rendimiento. Si bien la brecha es mucho más pequeña hoy, todavía existe.
A pesar de esta pérdida de rendimiento, los entornos virtuales se hicieron muy populares debido a la flexibilidad que brindan.
Al igual que con la velocidad de la red, puede encontrar que VM es el cuello de botella real y dada su escala real, ahorrará miles de millones de dólares al alojar su aplicación directamente, sin las VM. Pero esto no es lo que sucede para el 99.9% de las aplicaciones: su cuello de botella está en otro lugar, y el inconveniente de una pérdida de unos pocos microsegundos debido a la VM se compensa fácilmente con los beneficios de la abstracción y escalabilidad del hardware.