在scala-akka演员我应该在处理消息时开启未来吗?

时间:2014-06-01 08:49:56

标签: scala akka actor

我有一个演员,它接收一条消息来执行像发送alert这样的操作,这是演员的目的。发送提醒。我现在应该打开future并在another async mechanism中发送警报吗?或者是我的actor receive - 发送警报已经是我正在等待的异步过程吗?

2 个答案:

答案 0 :(得分:4)

这实际上取决于发送警报的内容。更具体地说,发送该警报需要阻止代码。您希望避免在actor系统的默认调度程序中阻塞。如果发送警报需要阻塞操作(比如说同步I / O操作),那么您可以考虑几种不同的方法:

1)给这个演员它自己的调度员,这样它的阻挡不会影响你的演员系统的主调度员。这种技术被称为"批量标题" (我更喜欢"防火墙")因为你正在从你的应用程序的其余部分封锁你的缓慢/阻塞(和潜在危险的代码)。如果您有一个发送这些警报的actor,您可能需要考虑一个Pinned Dispatcher,这会导致该actor拥有它自己执行的线程。

2)将潜在危险的警报包裹在Future中。这会将阻止代码从主调度程序移到另一个ExecutionContext(假设您为这些类型的事物提供了不同的代码,而不是仅使用演员本身的调度程序),这应该更安全。我不喜欢这种方法,因为它可能导致关闭可变状态并可能导致竞争条件(演员试图首先避免),但如果安全地完成,它可能是有效的。

我会诚实地坚持使用方法1,因为它更符合Akka范式,但这只是我的观点。这两种方法都适合你,因为我确定还有其他方法。

如果发送警报是非风险和/或非阻止的,则IMO无需使用Future

答案 1 :(得分:0)

这取决于发送此警报是“长时间运行的阻止过程”。如果是的话,你应该把它作为一个未来 - 是的。如果不是,只需依靠Actor来执行此操作