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.
- ¿Cuáles son mis posibilidades de pasar del soporte técnico al desarrollo en NTT Data?
- ¿Qué es mejor, NUST ingeniería de software o BSCS rápido?
- ¿Se utiliza el término API de forma ambigua y cómo?
- ¿Cómo debo abordar la lectura de un documento de especificación de hardware?
- ¿Los desarrolladores de software copian el código de sus colegas?
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