¿Por qué se requiere una arquitectura asincrónica para lograr la escalabilidad? ¿Puede por favor proporcionar una aplicación / ejemplo de la vida real?

Ok, antes que nada, aclaremos los términos en el contexto correcto:

La arquitectura asincrónica libera al procesador para enfocarse en otra cosa mientras se espera el resultado en segundo plano.

Los programas asincrónicos manejan tareas que están en progreso al mismo tiempo, pero solo es necesario trabajar brevemente y por separado en cada tarea, por lo que el trabajo puede ser intercalado en el orden que requieran las tareas.

La escalabilidad se logra cuando un programa puede mantener el mismo rendimiento a medida que aumenta el volumen de datos.

Ahora, con los términos aclarados, aquí está el ejemplo de la vida real:

Tengo tres dispositivos en la red de los que quiero leer el estado, lo que puedo hacer según la API:

string status = ReadStatus(int deviceID)

Esos dispositivos están bastante ocupados la mayor parte del tiempo y no pueden responder instantáneamente. En promedio, he medido el tiempo de respuesta para cada dispositivo a 100 ms. Estoy usando un procesador con 4 núcleos para enviar las solicitudes a mis dispositivos.

A continuación, he señalado los tres paradigmas arquitectónicos diferentes que puedo elegir al diseñar una solución: síncrono, multinúcleo (paralelo) y asíncrono.

  • Cada dispositivo se anota con D1, D2 y D3
  • C1, C2, C3 son los núcleos utilizados para procesar las solicitudes
  • La pequeña línea horizontal azul representa la solicitud de estado que se activa
  • En rojo tenemos tiempo para esperar antes de que vuelva la respuesta.

Ahora veamos qué está sucediendo en cada paradigma.

1. Sincrónico

Usamos un núcleo para solicitar el estado, esperamos 100 ms para que uno de los dispositivos nos devuelva el estado y luego pasamos al siguiente.

Tiempo Total:

100ms x 3 dispositivos = 300ms de tiempo de espera

Hmm me parece un tiempo muy pequeño … entonces, ¿por qué esto no es escalable?

En lugar de 3, imagine tener 30,000 dispositivos en la misma red. Eso es 3.000 segundos de tiempo de espera, en el que ha bloqueado con éxito cualquier otra actividad en el núcleo de la CPU.

2. Multinúcleo (paralelo)

¡Ah, pero espera, estamos ejecutando una CPU con 4 núcleos! ¿Por qué no utilizarlos completamente?

Podemos paralelizar nuestra aplicación para ejecutar cada solicitud de estado en un núcleo separado simultáneamente, reduciendo así el tiempo de espera a solo 100 ms.

Creo que sé lo que vas a hacer con esto …

De manera similar a lo anterior, imagine tener 30,000 dispositivos. Para lograr un tiempo de respuesta total de 100 ms, tendría que comprar 7,500 procesadores adicionales ** que pueden ejecutar sus solicitudes en paralelo … ¡Ay, eso es mucho dinero!

** ok, los procesadores modernos y justos hacen un buen uso de los hilos y el corte de tiempo para reducir el tiempo de espera, pero por simplicidad, he excluido estas opciones

3. Asincrónico

Por ahora, debemos habernos dado cuenta de que no hay necesidad de esperar cada estado antes de pasar al siguiente dispositivo.

¿Qué pasa si pateamos cada solicitud una tras otra, bam, bam, bam … lleva muy poco tiempo hacerlo (microsegundos), después de lo cual el núcleo es libre de realizar otras tareas mientras esperamos que los dispositivos respondan. 100 ms después, las respuestas comenzarán a llegar (tal vez en el orden incorrecto, pero ¿a quién le importa?), Y podemos recopilar los datos.

Tiempo total de espera? 100ms, y no más de un núcleo involucrado. Además, durante esos 100 ms, el procesador era libre de manejar otros trabajos.

===

Suena demasiado bueno para ser verdad, ¿hay algún costo asociado con la implementación de arquitecturas asincrónicas?

Si, si los hay. Verá, cuando dispara una solicitud asincrónica y espera la respuesta, se producen muchas interrupciones a nivel de hardware y cambio de contexto a nivel de sistema operativo. Ambos ocupan un poder informático precioso, por lo tanto, debe tener mucho cuidado al medir la relación costo / beneficio.

Además, debe comprender realmente la diferencia entre el código enlazado a la CPU y el enlazado a IO ; en mi ejemplo, he asumido que las solicitudes están enlazadas a IO; todos los resultados se caen por la ventana si se trata de código vinculado a la CPU.

EDITAR 1: correcciones gramaticales / ortográficas

¿Puedes citar la fuente de la afirmación? Algunos dicen que asíncrono lo resuelve, algunos dicen que multihilo lo hará. No sé la respuesta, supongo que no hay una bala de plata, dependerá de lo que estés construyendo.

Lo que ocurre con la programación asíncrona es que no bloquea , por lo que incluso si no puede usar múltiples hilos, no necesita bloquear su hilo principal hasta que tenga la respuesta para cada instrucción / operación. Estrictamente hablando, no realizará dos cosas a la vez (dos operaciones en el tiempo de una instrucción de computadora), pero puede tener el hilo libre para nuevas instrucciones para comenzar o girar como si fuera simultáneamente.

Lo que esto significa para un servidor , como uno HTTP basado en Node, es que cada vez que hay una acción que pertenece a una instrucción, pero no requiere la CPU, los usuarios no necesitan esperar. Por ejemplo, si varios usuarios solicitan una página y en las instrucciones para responder hay varias otras solicitudes que son asíncronas (para la base de datos, el sistema de caché, etc.), el hilo no se bloqueará en espera de tales respuestas que en realidad no depende de ello. Debido a eso, el servidor podrá comenzar a responder varias solicitudes mucho más rápido que un servidor síncrono de bloqueo normal, que esperaría a que todo se haga dentro de una sola instrucción hasta que se libere el hilo.

Puede parecer que esto contribuye a la escalabilidad, pero de hecho es mucho más complicado que eso.

Ahora, cuando hablamos de arquitectura asincrónica, es otro nivel de pensamiento. “Recientemente”, muchos están tratando de llevar este concepto a lo que se llama arquitectura ” sin servidor “, lo que significa que solo las funciones / instrucciones puras se almacenan bajo un enfoque diferente, como AWS Lambda. Con eso, cada instrucción obtiene los recursos necesarios para ejecutarse solo cuando sea necesario y de forma asincrónica. El servidor y los recursos se administran automáticamente e, idealmente, no debe preocuparse. Eso, realmente suena como algo que puede conducir a una verdadera escalabilidad . Sin embargo, lo que escucho es que el enfoque no es aplicable al 100% de las bases de código y la forma de programar y conectar todas las partes sigue siendo muy diferente y nueva para que suceda perfectamente, especialmente la resolución de problemas.

P: ¿Por qué se requiere una arquitectura asincrónica para lograr la escalabilidad? ¿Puede por favor proporcionar una aplicación / ejemplo de la vida real?

Respuesta corta: no se requiere una ‘arquitectura asincrónica’ para lograr escalabilidad. Los subprocesos livianos son suficientes para lograr una arquitectura masivamente escalable (uso eficiente de recursos compartidos) sin la necesidad de E / S asíncronas o un modelo de programación complejo.

Vea la respuesta de Anton Carver a ¿Qué lenguajes de programación admiten hilos muy ligeros en su implementación de referencia?

Vea la respuesta de Anton Carver a ¿Qué idioma es mejor para cientos de miles de solicitudes simultáneas?

La E / S asincrónica es más aplicable a problemas relacionados con la comunicación en tiempo real, por ejemplo: video interactivo (videoconferencias), tickers de stock, etc.

Aclaración : por IO asíncrono, me refiero a IO impulsado por señal / interrupción. La mensajería asincrónica / RPC (donde el programador ejecuta otro hilo ligero en lugar de bloquear) es absolutamente un requisito de un sistema distribuido escalable. La respuesta de Anton Carver a ¿Por qué las cosas son difíciles de sincronizar en sistemas distribuidos?

Aclaración adicional: es la “realidad” la que es asíncrona, no la arquitectura del software.

Imagine un restaurante de Mc Donald’s con 4 empleados que sirven en el mostrador. En aras de la discusión, imagine que pueden tomar 4 clientes, 1 cada uno, al mismo tiempo, y no podrían servir el siguiente lote hasta que se atiendan los 4.

Ahora, puede ver que el tiempo para atender el lote dependerá del tiempo necesario para atender la solicitud que necesita más tiempo (ya sea porque el empleado es más lento que los demás o porque el pedido para cumplir es mayor). Los otros tres probablemente estarán inactivos esperando en el mostrador.

Ahora, imagine que para establecer que todo el mundo ha terminado, deben tocar el hombro de los demás cuando hayan terminado. La cantidad de tapping aumenta cuadráticamente con el número de empleados.

El desacoplamiento y la independencia permiten una paralelización masiva.

More Interesting

¿Cómo es trabajar como ingeniero de software en Microsoft, Dubai?

¿Cuál es el mejor procesador para desarrolladores?

¿Debo formar el equipo técnico interno ahora o externalizar el desarrollo, hacer el lanzamiento y contratar talento después?

¿Cuál es la diferencia entre una entrevista de pasantía de ingeniería de software y una entrevista de pasantía de ingeniería de front-end en Google?

Si no voy a una escuela superior, ¿debería hacer ingeniería informática en lugar de ciencias de la computación para ser competitivo para las oportunidades de trabajo de software?

¿Qué hizo Mark VandeWettering como parte del desarrollo del software RenderMan en 'Toy Story'?

¿Cuáles son los beneficios de la programación orientada a objetos?

¿El sistema educativo de los Estados Unidos produce una cantidad suficiente de ingenieros de software por año para cubrir las necesidades del mercado?

¿Qué es la mantenibilidad en ingeniería de software?

¿Qué debe hacer un desarrollador que comienza en un nuevo equipo en los primeros 90 días?

Como desarrollador o gerente de producto, ¿cuáles son las características de las mejores personas de control de calidad que conoces? ¿Puede dar ejemplos de cómo estas personas de QA hicieron su trabajo mejor que otras en el mismo rol?

¿Son los desarrolladores realmente tan diferentes de otros trabajadores de cuello blanco?

¿Cuál es su día promedio en el trabajo como ingeniero de software / programador?

Después de estudiar programación durante varios años, ¿puede alterar el código de software de su teléfono para que sea más conveniente de usar o es demasiado complejo?

¿Cuál es la relación de mejores prácticas de ingenieros frente a producto en compañías de software?