scala - 在实践中使用 Scala Actor 编写应用程序

标签 scala actor

我现在已经使用 scala actor 编写了一些应用程序,并且我对人们如何处理或处理我遇到的一些问题感兴趣。

过多的消息类或!?

我有一个 Actor ,它对用户操作使用react,并且必须导致某些事情发生。假设它对消息 UserRequestsX(id) 使用react。我遇到的一个持续的问题是,因为我想模块化我的程序,所以单个 Actor 本身无法在不涉及其他 Actor 的情况下完成 Action 。例如,假设我需要使用 id 参数来检索一堆值,然后需要通过其他参与者删除这些值。如果我正在编写一个普通的 Java 程序,我可能会这样做:

public void reportTrades(Date date) {
    Set<Trade> trades = persistence.lookup(date);
    reportService.report(trades);
}

这很简单。然而,使用 actor 这会变得有点痛苦,因为我想避免使用 !?。一个参与者对 ReportTrades(date) 消息作出 react ,但它必须向 PersistenceActor 请求交易,然后向 ReportActor 请求报告交易。我发现这样做的唯一方法是:

react {
    case ReportTrades(date) =>
       persistenceActor ! GetTradesAndReport(date)
}

因此,在我的 PersistenceActor 中,我有一个 react block :

react {
    case GetTradesAndReport(date) =>
       val ts = trades.get(date) //from persietent store
       reportActor ! ReportTrades(ts)
}

但现在我有两个问题:

  1. 我必须创建额外的消息类来表示相同的请求(即“报告交易”)。事实上,在这种情况下我有三个,但我可能有更多 - 跟踪这些就成了一个问题
  2. 我应该如何称呼第一条和第三条消息ReportTrades?将它们都称为ReportTrades 会令人困惑(或者如果我这样做,我必须将它们放在单独的包中)。本质上不存在通过 val 类型重载类这样的事情。

我有什么遗漏的吗?我可以避免这种情况吗?我是否应该放弃并使用!?人们是否使用某种组织结构来澄清正在发生的事情?

最佳答案

对我来说,您的 ReportTrades 消息混合了两个不同的概念。一个是请求,命令是响应。例如,它们可能被命名为 GetTradesReport(Date)SendTradesReport(List[Trade])。或者,也许是 ReportTradesByDate(Date)GenerateTradesReport(List[Trade])

关于scala - 在实践中使用 Scala Actor 编写应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310846/

相关文章:

model - 使用 zeromq 实现actor模型

java - 停止(getSelf())与停止(this.getSelf())

Scala 2.10 和包反射

scala - Actor 模型中 Actor 的生命周期

scala - Akka actor pipeline和拥塞store actor

scala - 如何在scala中将字符串与方法结果匹配?

scala - 用于 Ocaml 和其他语言的基于 Actor 的分布式并发库

scala - 关于Scala变量可变性的问题

scala - Spark 分区 Hive 表

scala - 每次使用时都会初始化 Scala 对象的字段