Un peu plus loin avec les acteurs AKKA

Après avoir évoqué (ici) le concept des acteurs, nous allons maintenant nous pencher sur des exemples un peu plus complexes. Le code de cette série est disponible dans github.

Utiliser des case class pour les messages

Comme vu précédement, les acteurs communiquent entre eux par des messages. Au lieu de passer uniquement des Strings, on peut former ces messages dans des case class. Ceci permet à la fois de véhiculer des ensembles de valeurs, mais aussi de détecter la nature du message à la réception.

Ask pattern vs Tell

L’envoi de message tel que nous l’avons vu jusqu’alors se faisait au travers de la commande “Tell” matérialisée par le “!”. Tell fonctionne avec une approche “Fire and forget”. Le message est acheminé vers l’acteur destinataire et il n’y a pas de valeur retour ni de contrôle de ce qui est réalisé. Cette approche si elle permet une grande flexibilité et une grande performance de par l’asynchronisme, a ses limites quand il s’agit de récupérer un résultat. On peut dans ce cas utiliser le pattern “Ask” qui est matérialisé par “?” et permet de travailler de manière synchrone.

L’implémentation de la fonction “receive” dans l’acteur renvoie une réponse à l’appelant “sender”. Un timeout est définit de manière implicite, et l’appel au travers de “ask” se fait avec des futures afin de gérer l’attente du résultat.

Timeouts

L’utilisation du pattern ask nécessite de gérer assez finement les timeouts implicits utilisés dans les appels. La petite modification du code précédent pour ajouter un délai dans l’execution de l’acteur, va faire crasher assez facilement l’application.

Dans un prochain blog, nous regarderons de quelle manière des acteurs peuvent être chainés et parallèlisés pour réaliser des traitement de plus grande ampleur.