Comment le modèle d'acteur (dans Akka) fonctionne-t-il lorsque vous devez effectuer des E/S (par exemple, une opération de base de données) ?
D'après ce que j'ai compris, une opération bloquante lèvera une exception (et ruinera essentiellement toute concurrence en raison de la nature événementielle de Netty, qu'Akka utilise). Par conséquent, je devrais utiliser un Future
ou quelque chose de similaire - mais je ne comprends pas le modèle de concurrence.
- Un acteur peut-il traiter plusieurs messages simultanément ?
- Si un acteur fait un appel bloquant dans un fichier
future
(c'est-à-dire.future.get()
) bloque-t-il uniquement l'exécution de l'acteur actuel ou empêche-t-il l'exécution de tous les acteurs jusqu'à ce que l'appel bloquant soit terminé ? - S'il bloque toute exécution, comment l'utilisation d'un futur favorise-t-elle la concurrence (c'est-à-dire que le fait d'invoquer des appels bloquants dans un futur ne revient-il pas à créer un acteur et à exécuter l'appel bloquant) ?
- Quelle est la meilleure façon de traiter un processus à plusieurs étapes (par exemple, lecture de la base de données, appel d'un service Web bloquant, lecture de la base de données, écriture dans la base de données) où chaque étape dépend de la précédente ?
Le contexte de base est le suivant :
- J'utilise un serveur Websocket qui va maintenir des milliers de sessions.
- Chaque session a un certain état (par exemple, les détails d'authentification, etc.) ;
- Le client Javascript envoie un message JSON-RPC au serveur, qui le transmet à l'acteur de session approprié, qui l'exécute et renvoie un résultat.
- L'exécution de l'appel RPC implique des entrées/sorties et des appels bloquants.
- Il y aura un grand nombre de demandes simultanées (chaque utilisateur effectuera un nombre important de demandes sur la connexion WebSocket et il y aura beaucoup d'utilisateurs).
Y a-t-il un meilleur moyen d'y parvenir ?