J'ai fini de lire le livre Effective Akka de Jamie Allen. Je suis assez nouveau sur Akka, je ne comprends pas vraiment pourquoi à un moment donné il dit:

Cependant, il y a plusieurs choses à ce sujet qui ne sont pas idéales. Tout d'abord, il utilise des futurs pour demander des réponses à d'autres acteurs, ce qui crée un nouveau PromiseActorRef pour chaque message envoyé dans les coulisses. C'est un gaspillage de ressources. Il vaudrait mieux que notre acteur envoie des messages de manière «feu et oublie» et collecte les résultats de manière asynchrone en un seul acteur.

Utiliser Ask au lieu de Tell semble généralement être plus coûteux. Combien coûte plus cher d'utiliser un Pull au lieu d'un Push? Et aussi, pourquoi un Tell est-il généralement préférable à un Ask?

2
abx78 23 déc. 2015 à 01:39

2 réponses

Meilleure réponse

Je suis l'auteur de Effective Akka. Mon point sur l'utilisation de Ask était que vous utilisez un Future. Si vous regroupez plusieurs demandes en une seule réponse, vous avez créé plusieurs délais d'expiration pour chaque avenir qui se trouve derrière la demande. À petites doses, ce n'est pas un gros problème, mais dans le grand, cela s'ajoute à un frein supplémentaire sur les performances.

Notez que ce livre a été écrit en 2013, et bien que la plupart d'entre eux soient toujours pertinents, Akka Streams et l'approche de contre-pression de Reactive Streams ont annulé une partie de la discussion sur le choix entre push et pull. Dans toute situation où le (s) producteur (s) ou le (s) consommateur (s) pourraient être submergés, Akka Streams est certainement une meilleure approche.

Merci d'avoir lu le livre, j'espère que vous l'avez trouvé utile!

6
jamie 24 déc. 2015 à 01:25

L'utilisation d'un tell est préférable car:

Pas de blocage en attente d'un message. Cela donne les meilleures caractéristiques de concurrence et d'évolutivité.

L'utilisation de ask a des implications sur les performances, car quelque chose a besoin pour savoir quand il arrive à expiration, il doit y avoir quelque chose qui relie une promesse à un ActorRef et il doit également être accessible via la communication à distance . Alors préférez toujours dire pour la performance, et demandez seulement si tu dois. http://doc.akka.io/docs /akka/2.4.1/java/untyped-actors.html#Send_messages

S'il y a un cas où vous utilisez ask dans un endroit où tell aurait pu être utilisé, alors vous avez gaspillé des ressources. Si vous ne vous souciez pas d'une réponse, pourquoi gaspilleriez-vous des frais généraux (ou des ressources) en faisant en sorte que votre système en renvoie une?

2
BatteryAcid 23 déc. 2015 à 15:26