Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why creating an actor within actor is dangerous

Tags:

scala

akka

The akka documentation is clearly stated that it is dangerous to create an actor within an actor like this:

class ActorA extends Actor {
  def receive = ???
}

final class ActorB extends Actor {
  def receive = {
  case _ =>
  val act = context.actorOf(Props(new ActorA))
}}

I understand that the Actor's apply method is accepting this reference of the creating actor. yet I couldn't understand (nor couldn't find any example) why this is harmful and what issues it can cause?

like image 726
igx Avatar asked Jun 14 '17 06:06

igx


People also ask

Why is acting dangerous?

Raw emotion or unresolved emotions conjured up for acting may result in a sleep deprivation, anger, depression, anxiety and the cyclical nature of the ensuing side effects. Sleep deprivation alone can lead to impaired function, causing some individuals to "acute episodes of psychosis".

How do actors separate themselves from the character?

Examples of de-roling techniques include shaking limbs and body to literally shake the character off, or ritualistically stepping out of a performance by handing back a character's specific prop or costume piece to a director.


1 Answers

Let's tweak your example a little bit

class ActorA(str:String) extends Actor {
  def receive = ???
}

final class ActorB extends Actor {
  def receive = {
  case _ =>
  val act = context.actorOf(Props(new ActorA("hidden")))
}}

Most of the common use case of using actors are to handle failover and supervision, shen an actor fails and needs to be restarted, the actor system needs to know how to do that. When you use Props(Props(new ActorA)), you've hidden the parameter value of "hidden" by handling it yourself.

Rather than doing that if instead, you declare how to create instances of the actor, the actor system will know exactly what it needs to do when recreating an actor - i.e. create an instance of ActorA with a constructor argument of "hidden".

Even with your example of Actor without param

context.actorOf(Props(new ActorA))

this way of instantiating actors within another actor is not recommended because it encourages to close over the enclosing scope, resulting in non-serializable Props and possibly race conditions (breaking the actor encapsulation).

like image 52
Atiq Avatar answered Sep 27 '22 22:09

Atiq