学习 Akka(三):消息传递

Akka 有四类消息模式:

  • Ask
  • Tell
  • Forward
  • Pipe

Ask 消息模式

Ask 模式产生了一个 future 代表来自 Actor 的回复。

当你 ask 一个 Actor 时,Akka 实际上创建了一个用于回复的临时 Actor,即 sender() 引用的 Actor。

当 Actor 回复了消息,临时的 Actor 就完成了该 future。

ask_pattern

首先,引入 Ask 消息模式包:

import akka.pattern.ask  

这样,ActionRef 就支持 Ask 消息模式了

然后,引入 Timeout 包和 Duration 包

引入 Duration 包,就可以使用 Duration DSL 创建 Timeout

例如:1 second10 seconds

import akka.util.Timeout  
import scala.concurrent.duration._  
implicit val timeout = Timeout(10 seconds)  

最后,调用 ask 方法

ask 方法需要一个隐式参数 Timeout,在超时之前未得到响应 future 将失败

val future = actionRef ? message  

Tell 消息模式

Tell 是最简单的消息模式,它被视为“fire and forget”消息传递机制。

默认情况下,发送者(sender)默认为发送消息的 Actor,如果没有发送者,那么响应地址默认为 DeadLetters

tell_pattern

tell 是 ActionRef/ActionSelection 类的方法

actionRef ! message  

注意:在设计系统时,要尽量多使用 Tell 而少使用 Ask

Forward 消息模式

Forward 类似于转发邮件,原始的发送方还是一样的,但是有了一个新的接收方。

forward_pattern

Pipe 消息模式

经常,在 Action 中我们有一个 future,然后我们想将 future 的消息发送给 Actor

不使用 Pipe,需要把 sender() 存储在引用中,然后在 future 的回调方法里将信息发回给发送者,因为它们在不同的执行上下文里:

val senderRef = sender()  
future.onSuccess { ... }  
future.onFailure { ... }  

有了 Pipe,可以简化为:

future pipeTo sender()  
pipe(future) to sender()