【问题标题】:Akka Actor ask and Type SafetyAkka Actor 询问和类型安全
【发布时间】:2015-12-21 05:50:03
【问题描述】:

如何使用 Akka Actor 询问和维护类型安全?还是避免使用 ask 来支持 tell?

在 Akka Actor 上调用 ?ask 时,会返回 Future[Any],我必须通过 future.mapTo[MyType] 进行显式转换。

我不喜欢失去这种类型的安全性。如果我直接使用 Futures(没有演员),我可以显式返回 Future[MyType] 并保持类型安全。

我的具体用例涉及一个演员将它的消息委托给两个子演员,然后汇总这些演员的结果并将其返回给父母的发件人。我父母的接收方法看起来类似于 Akka Docs 中的这种方法:

http://doc.akka.io/docs/akka/2.0/scala/futures.html#For_Comprehensions

val f1 = actor1 ? msg
val f2 = actor2 ? msg

val f3 = for {
  a ← f1.mapTo[Int]
  b ← f2.mapTo[Int]
  c ← ask(actor3, (a + b)).mapTo[Int]
} yield c

有没有更好的方法来实现我的用例?

【问题讨论】:

  • typed actors 呢?
  • 谢谢。我一定错过了文档中的那一点——它们似乎符合要求。 'When to use Typed Actors' 部分和链接的博客文章都很好读,并且很好地说明了为什么 Actors 是无类型的。我现在想我会尝试坚持使用无类型的演员。如果您作为答案发布,我会接受。

标签: scala asynchronous akka actor future


【解决方案1】:

我想发布一个新答案,因为@Roland Kuhn 最近为此提出了一个名为 Typed Channels 的新解决方案:

val f: Future[MyType] = actor <-?- message

【讨论】:

  • 似乎键入的频道实验最终只是实验。为 Akka 3 计划了一个不同的解决方案(有关更多信息,请参阅 here
【解决方案2】:

试试typed actors。基本上,它们允许您使用强类型特征/接口与参与者交互,而不是通过交换消息。在幕后,Akka 使用动态代理来实现这些接口并执行异步魔法。

类型化的actor可以返回具有不同的强类型返回值的方法(来自上述文档):

def squareDontCare(i: Int): Unit //fire-forget

def square(i: Int): Future[Int] //non-blocking send-request-reply

def squareNowPlease(i: Int): Option[Int] //blocking send-request-reply

def squareNow(i: Int): Int //blocking send-request-reply

这些方法代表tell,而其余的则是ask的不同风格。

【讨论】:

  • 没有类型化的actor不会为动态代理的东西带来一些额外的成本吗?只是想知道...
  • 是的,代理、包装消息和在幕后使用 Future 是有成本的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2010-10-26
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多