在Akka询问和告诉的区别?

时间:2014-04-03 15:05:59

标签: scala asynchronous akka

阅读Scala文档我很难理解ask和tell之间的区别。

http://doc.akka.io/docs/akka/snapshot/scala/actors.html州:

  

!意思是“即发即忘”,例如异步发送消息   马上回来。也称为告诉。

     

?异步发送消息并返回表示a的Future   可能的答复。也称为问。

如果我使用的演员生成网络请求,那么ask和tell之间有什么区别?在这两种情况下,请求都将异步生成,并且必须等待响应,换句话说,如何"告诉"如果actor正在调用Web服务并等待响应,则立即返回?

2 个答案:

答案 0 :(得分:12)

asktell之间的区别是从邮件发件人(不一定是演员)的角度出发。 ask将发送消息并返回未来,可以等到超时或收到回复,tell将发送消息并立即返回。

ask的情况下,接收消息的actor应该在操作完成时回复发件人。

答案 1 :(得分:11)

听起来您已经知道asktell之间的基本区别,但不了解tell如何用于让其他参与者参与处理HTTP请求。

为了在HTTP请求处理程序中使用tell是有意义的,您必须使用不要求请求处理程序返回其响应的HTTP服务器。 Spray就是这样的HTTP服务器。

在Spray中,请求处理程序不返回其响应;给它一个RequestContext对象,响应请求涉及调用它的一些方法。您可以简单地将RequestContext发送给另一个actor,然后该actor可以响应请求:

path("foo") {
  rc => rc complete "foo"  // respond here
} ~
path("bar") {
  rc => barActor ! DoBar(rc)  // send it to bar; NO RESPONSE HERE
}

然后barActor提到的演员可以说

case DoBar(rc) =>
  rc complete "bar"  // respond here, in another actor

Spray将请求上下文打包成一个可以从任何actor传递并完成的对象这一事实非常适合actor模型。另一方面,如果您的Web框架要求被调用的处理程序返回响应,那么如果您想要涉及另一个actor,您唯一的选择是使用ask

Typesafe宣布Play将很快使用Spray。我希望这意味着Play将允许将请求发送给其他参与者进行处理。