Mensajes, Canales y Actores Flashcards
Explicar las tres clasificaciones de modelos de comunicación vistos en clase.
La primer clasificación de comunicación es:
- sincrónica: se envía un mensaje y el sistema se queda esperando a que llegue la respuesta. Pensá en una llamada telefónica.
- asincrónica: se envía un mensaje, pero el sistema no se queda esperando, continúa ejecutando otras tareas, enviando otros mensajes, etc. Eventualmente llegará la respuesta y se reaccionará en ese entonces. Pensá en un email.
La segunda clasificación es:
- simétrica: comunicación 1-1
- asimétrica: comunicación 1-muchos, como un broadcast. Pensá en publicar un tweet.
- sin direccionamiento: cuando el mensaje se manda a todos, pero dependiendo del tipo de mensaje, algunos lo procesan y otros lo descartan.
La tercer clasificación es según el flujo de datos:
- unidireccional: sólo escribo o sólo recibo mensajes
- bidireccional: escribo y recibo mensajes
Qué es un canal? Qué lo compone?
Un canal es una entidad que comunica un emisor con un receptor, y posee las siguientes características:
- nombre (para identificarlo)
- tipo (se puede mandar un único tipo de objeto por canal)
- clasificación de sincrónico o asincrónico
- suelen ser unidireccionales
Qué es un pipe? Y una fifo? Cuál es su diferencia?
Son los canales que se implementan en UNIX. La diferencia es que un pipe no vive en el file system, mientras que una fifo sí. Los pipes sólo viven en memoria.
Pero ambos sirven para comunicar programas en la misma computadora.
Qué es el Selective Input?
Es una herramienta que Rust no implementa, pero otros lenguajes sí. Se trata de una sintaxis que permite escuchar en varios canales de forma bloqueante, y desbloquearse cuando llega un mensaje a alguno de ellos.
Esta herramienta nos permite evitar un busy wait para revisar de a varios canales a la vez.
Qué son las Remote Procedura Calls?
Esta herramienta permite al cliente ejecutar funciones en un servidor localizado en otro procesador. Parece que se está llamando a una función normal, pero en realidad esta función se ejecuta en otro servidor. El objetivo es simplificar el código para el programador y el lector.
Qué características tiene un canal en Rust?
Características de un canal en Rust:
- tiene un extremo emisor y otro receptor, es unidireccional
- permite duplicar el extremo emisor para tener múltiples productores, aunque sólo se permite un único consumidor
- al enviar un elemento al canal, se transfiere el ownership del elemento enviado
Qué es un actor? Qué características tiene?
Un actor es una entidad que encapsulan comportamiento y estado interno. Para modificar el estado interno, se deben enviar mensajes que lo modifiquen.
Un actor posee:
- estado interno
- implementa mensajes y handlers para recibir esos msjs
- vive en un contexto de ejecución propio
- una casilla de mensajes interna
A su vez, los mensajes se envían de manera bloqueante (aunque no se espera a la respuesta antes de continuar) y se procesan de a uno a la vez.
Por otro lado, los actores se pueden comunicar con otros actores que viven en la misma computadora, o en otra computadora (a través de sockets) sin inconvenientes.
Cuáles son las funciones para enviar mensajes entre actores de Rust? En qué se diferencian?
Las tres funciones que se proveen en Rust son:
- do_send: envía inmediatamente pero ignora errores en el envío de mensajes
- try_send: envía inmediatamente pero si hay un error, lo comunica
- send: retorna un future del resultado del proceso
Se recomienda utilizar try_send.
Cuáles son los beneficios de utilizar el modelo de actores?
- Los actores son más livianos que los threads: se pueden tener miles en memoria sin problemas.
- El estado interno de los actores es privado, y sólo él puede acceder a él. A su vez, los mensajes entrantes se procesan de a uno a la vez. Todo esto implica que no hay necesidad de utilizar locks o mutexs de manera interna. No hay memoria compartida, race conditions ni deadlocks.
- Perfectos para resolver situaciones asincrónicas, el código es muy legible y sencillo de implementar y entender
Qué es el Context? Y el Arbiter?
El contexto es el espacio de memoria donde vive el actor, es un contexto específico para él, y contiene su estado y toda la información necesaria para que él se ejecute correctamente. Aquí vive la casilla de mensajes, a donde llega el mensaje originalmente, para que luego el contexto llame al handler correspondiente.
El arbiter es la entidad superior a los actores, que los spawnea y los sobrevive. Él es el que crea el o los threads correspondientes, ejecutan el event loop, y demás.