scala - 在 scala-akka actor 中,我应该在处理消息时打开一个 future 吗?

标签 scala akka actor

我有一个 Actor ,它接收消息来执行诸如发送警报之类的操作,这就是 Actor 的目的。发送警报。我现在应该打开一个future并将警报的发送包装在另一个异步机制中吗?或者我的 Actor 接收 - 发送警报已经是我正在等待的异步过程?

最佳答案

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

1) 为该 Actor 提供自己的调度程序,这样它的阻塞就不会影响 Actor 系统的主调度程序。这种技术被称为“批量标题”(我更喜欢“防火墙”),因为您将缓慢/阻塞(以及潜在危险的代码)与应用程序的其余部分隔离开来。如果您有一个发送这些警报的参与者,您可能需要考虑 Pinned Dispatcher这将导致该参与者拥有自己的执行线程。

2) 将潜在危险警报发送代码包装在 Future 中。这会将阻塞代码从主调度程序移出并移至另一个 ExecutionContext 中(前提是您为这些类型的事物提供不同的调度程序,并且不只使用 actor 本身的调度程序),这应该是更安全。我不喜欢这种方法,因为它可能导致关闭可变状态并可能导致竞争条件(参与者首先试图避免这种情况),但如果安全地完成,它可能是有效的。

老实说,我会坚持使用方法 1,因为它更适合 Akka 习惯用法,但这只是我的意见。这两种方法都适合您,因为我确信还有其他几种方法。

如果发送警报是无风险和/或非阻塞的,那么 IMO 就不需要使用 Future

关于scala - 在 scala-akka actor 中,我应该在处理消息时打开一个 future 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23978165/

相关文章:

scala - 如何在超时的单独调度程序上运行 Akka 流图?

java - 终止 Future 并获得中间结果

java - Akka:在 child Actor 完成后停止 Actor

java - Akka 集群 - 每个节点一个 Manager Actor

scala - 是否等待 Scala Future 阻塞线程?

Scalaz 自动类型类解析

scala - 如何在Spark SQL中将额外的参数传递给UDF?

scala - 在 Spark Streaming 中反序列化来自 Kafka 的 Avro 格式数据给出空字符串和 0 for long

scala - Scala 中的 Future 是一个 monad 吗?

scala - 如何禁用 Actor 恢复?