Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Akka actor forward message with continuation

I have an actor which takes the result from another actor and applies some check on it.

class Actor1(actor2:Actor2) {

  def receive = {
    case SomeMessage =>
      val r = actor2 ? NewMessage()
      r.map(someTransform).pipeTo(sender)
  }
}

now if I make an ask of Actor1, we now have 2 futures generated, which doesnt seem overly efficient. Is there a way to provide a foward with some kind of continuation, or some other approach I could use here?

    case SomeMessage => actor2.forward(NewMessage, someTransform)
like image 708
J Pullar Avatar asked Oct 03 '22 19:10

J Pullar


1 Answers

Futures are executed in an ExecutionContext, which are like thread pools. Creating a new future is not as expensive as creating a new thread, but it has its cost. The best way to work with futures is to create as much as needed and compose then in a way that things that can be computed in parallel are computed in parallel if the necessary resources are available. This way you will make the best use of your machine.

You mentioned that akka documentation discourages excessive use of futures. I don't know where you read this, but what I think it means is to prefer transforming futures rather than creating your own. This is exactly what you are doing by using map. Also, it may mean that if you create a future where it is not needed you are adding unnecessary overhead.

In your case you have a call that returns a future and you need to apply sometransform and return the result. Using map is the way to go.

like image 129
Vinicius Miana Avatar answered Oct 13 '22 10:10

Vinicius Miana