我有一个演员,它接收一条消息来执行像发送alert
这样的操作,这是演员的目的。发送提醒。我现在应该打开future
并在another async mechanism
中发送警报吗?或者是我的actor receive
- 发送警报已经是我正在等待的异步过程吗?
答案 0 :(得分:4)
这实际上取决于发送警报的内容。更具体地说,发送该警报需要阻止代码。您希望避免在actor系统的默认调度程序中阻塞。如果发送警报需要阻塞操作(比如说同步I / O操作),那么您可以考虑几种不同的方法:
1)给这个演员它自己的调度员,这样它的阻挡不会影响你的演员系统的主调度员。这种技术被称为"批量标题" (我更喜欢"防火墙")因为你正在从你的应用程序的其余部分封锁你的缓慢/阻塞(和潜在危险的代码)。如果您有一个发送这些警报的actor,您可能需要考虑一个Pinned Dispatcher,这会导致该actor拥有它自己执行的线程。
2)将潜在危险的警报包裹在Future
中。这会将阻止代码从主调度程序移到另一个ExecutionContext
(假设您为这些类型的事物提供了不同的代码,而不是仅使用演员本身的调度程序),这应该更安全。我不喜欢这种方法,因为它可能导致关闭可变状态并可能导致竞争条件(演员试图首先避免),但如果安全地完成,它可能是有效的。
我会诚实地坚持使用方法1,因为它更符合Akka范式,但这只是我的观点。这两种方法都适合你,因为我确定还有其他方法。
如果发送警报是非风险和/或非阻止的,则IMO无需使用Future
。
答案 1 :(得分:0)
这取决于发送此警报是“长时间运行的阻止过程”。如果是的话,你应该把它作为一个未来 - 是的。如果不是,只需依靠Actor来执行此操作