gpt4 book ai didi

Scala/akka 离散事件模拟

转载 作者:行者123 更新时间:2023-11-28 20:22:46 24 4
gpt4 key购买 nike

我正在考虑将大型代码库迁移到 Scala 并利用 Akka Actor 模型。我几乎立即遇到了以下概念性问题:

在现有代码库中,业务逻辑使用 SimPy 等离散事件模拟 (DES) 进行测试,并获得确定性结果。虽然实时程序为 hous 运行,但 DES 需要几分钟。实时系统可以是异步的,不需要遵循测试设置的确切顺序。我想对测试设置和实时设置使用相同的 Akka 代码。这在 Scala + Akka 中可以实现吗?

我曾考虑过中央消息队列 Actor 的想法——但我觉得这不是正确的方法。

最佳答案

解决您所述问题的一般方法是将您的“业务逻辑”与 Akka 代码隔离开来。这允许独立于 Akka 对业务代码进行单元测试和事件测试,这还允许您编写非常精简的 Akka 代码。

例如,假设您的业务逻辑是处理一些数据:

object BusinessLogic {
type Data = ???
type Result = ???

def processData(data : Data) : Result = ???
}

这是一个干净的实现,可以在任何并发环境中运行,而不仅仅是 Akka(Scala Futures、Java 线程,...)。

历史模拟

然后可以在您的离散事件模拟中运行核心业务逻辑:

import BusinessLogic.processData

val someDate : Date = ???

val historicData : Iterable[Data] = querySomeDatabase(someDate)

//discrete event simulation
val historicResults : Iterable[Result] = historicData map processData

如果并发能够使事件模拟器更快,那么可以使用非 Akka 方法:

val concurrentHistoricResults : Future[Iterable[Result]] = 
Future sequence {
historicData.map(data => Future(processData(data)))
}

Akka 实时

同时可以将逻辑合并到Akka Actors中。通常,让您的 receive 方法只不过是一个“数据调度程序”是非常有帮助的,Actor 定义中不应包含任何实质性代码:

class BusinessActor extends Actor {

override def receive = {
case data : Data => sender ! processData(data)
}
}

同样,业务逻辑可以放在 akka 流中进行背压流处理:

val dataSource : Source[Data, _] = ???

val resultSource : Source[Result, _] =
dataSource via (Flow[Data] map processData)

关于Scala/akka 离散事件模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com