as:Actor 和 Agent 的组合

akka: combination of Actor and Agent

  1. 最常用akka primitive is Actor - 任何状态更改或状态查询都是通过异步消息专门完成的。

  2. Akka还提供了鲜为人知的原语Agent,它通过新值异步更新(或者通过修改他的值的函数)ans可以从任何线程同步读取。

问题:在单JVM Actor系统中,如何结合这些方法:具有异步更新的原语。仅消息(如 Actor),但可以以线程安全方式直接读取哪个状态(如 Agent?

我非常感谢 link 任何相关 discussion/project/sample。

目前我找到的解决方案:

  1. 明显的可能性是 Actorreceive() 中更新 Agent。但我想知道是否有更优雅和高性能的解决方案。
  2. Scalaz Agent,但首选不依赖 scalaz 的解决方案。
  3. 半途肮脏的解决方案:打破Actor通过发布(在传出消息中)读取actor状态的功能分离,类似于Agent.get()。线程安全必须手动处理。
  4. 解决方法:让 Actor 更新 receive() 中的一些外部共享状态。线程安全必须手动处理。

请注意,代理已被 Akka 团队标记为 弃用 ,并将在下一个主要版本(可能是 2.5.0)中删除。 This是对应的票。

确实,Akka 的核心思想是鼓励异步通信,所以我想从这个角度来看放弃代理是有意义的。

另一种解决方案可能是使用 Actor 并异步访问其状态。如果这种情况与您有关,因为 Get 封邮件可能需要等待几封 Update 封邮件处理完毕,您可以考虑使用优先邮箱先处理 Get 封邮件。示例 here.