在 scala-akka actor 中,我应该在处理消息时打开一个未来



我有一个参与者,它接收一条消息来执行发送alert等操作,这就是参与者的目的。 发送警报。 我现在应该打开一个future并将警报的发送包装在another async mechanism中吗?还是我的actor receive - 发送警报已经是我正在等待的异步进程?

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

1( 为该角色提供自己的调度程序,这样它的阻塞就不会影响您的角色系统的主调度程序。 这种技术被称为"批量标题"(我更喜欢"防火墙"(,因为您将缓慢/阻塞(和潜在危险的代码(与应用程序的其余部分隔离开来。 如果只有一个执行组件发送这些警报,则可能需要考虑固定调度程序,这将导致此执行组件具有自己的执行线程。

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

老实说,我会坚持方法 1,因为它更适合 Akka 习语,但这只是我的意见。 这两种方法都可以为您工作,因为我相信还有其他几种方法。

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

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

最新更新