¿Cómo funciona el modelo de actor (en Akka) cuando necesita realizar E/S (es decir, una operación de base de datos)?¿Cómo funciona la E/S en Akka?
Tengo entendido que una operación de bloqueo lanzará una excepción (y esencialmente arruinará toda la concurrencia debido a la naturaleza de Netty, que Akka usa). Por lo tanto, tendría que usar un Future
o algo similar; sin embargo, no entiendo el modelo de simultaneidad.
- ¿Puede 1 actor procesar múltiples mensajes simultáneamente?
- Si un actor realiza una llamada de bloqueo en un
future
(es decir,future.get()
) eso bloquea solo la ejecución del actor actual; o ¿evitará la ejecución en todos los actores hasta que se complete la llamada de bloqueo? - Si bloquea toda la ejecución, ¿cómo el uso de una concurrencia de asistencia futura (es decir, no invocar las llamadas de bloqueo en un futuro aún equivale a crear un actor y ejecutar la llamada de bloqueo)?
- ¿Cuál es la mejor manera de tratar con un proceso de varias etapas (es decir, leer de la base de datos, llamar a un servicio web de bloqueo, leer de la base de datos, escribir en la base de datos) donde cada paso depende de la última?
El marco básico es el siguiente:
- estoy usando un servidor WebSocket que mantendrá miles de sesiones.
- Cada sesión tiene algún estado (es decir, detalles de autenticación, etc.);
- El cliente de Javascript enviará un mensaje JSON-RPC al servidor, que lo pasará al actor de sesión apropiado, que lo ejecutará y devolverá un resultado.
- La ejecución de la llamada RPC implicará algunas llamadas de E/S y bloqueo.
- Habrá un gran número de solicitudes concurrentes (cada usuario realizará una gran cantidad de solicitudes a través de la conexión WebSocket y habrá una gran cantidad de usuarios).
¿Hay una manera mejor de lograr esto?
Me sorprende que nadie haya mencionado la IO asincrónica con un enfoque similar al Node.js/Twisted/gevent, etc. –