阶/阿卡离散事件模拟(Scala/akka discrete event simulation)

2019-09-29 06:24发布

我正在考虑迁移大型代码库Scala和撬动阿卡Actor模型。 我遇到了以下问题的概念几乎立刻:

在现有的代码的基础上,业务逻辑是使用离散事件模拟(DES)等的SimPy与确定的结果进行测试。 虽然实时程序的运行HOUS的DES需要几分钟的时间。 实时系统可以是异步的,不需要按照测试设置的确切顺序。 我想利用相同的阿卡码两种测试设置和实时设置。 可这在斯卡拉+阿卡可以实现吗?

我曾幻想过与中央消息队列演员的想法 - 但觉得这不是正确的做法。

Answer 1:

解决你所说的问题的一般方法是你的“商业逻辑”,从阿卡代码隔离。 这使得业务代码进行单元测试,测试活动,独立阿卡它也可以让你写的很瘦阿卡代码。

举个例子,说你的业务逻辑是处理一些Data

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

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

这是一个干净的实现,可用于任何并发环境下运行,而不仅仅是阿卡(斯卡拉期货,Java线程,...)。

历史模拟

公司的核心业务逻辑然后可以在你的离散事件仿真运行:

import BusinessLogic.processData

val someDate : Date = ???

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

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

如果并发是能够使事件模拟器快则可以使用非阿卡方式:

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

阿卡实时

同时逻辑可以掺入阿卡演员。 一般来说它是非常有帮助,使您receive比“数据调度员”的方法罢了,不应该有居住在演员定义的任何实质性的代码:

class BusinessActor extends Actor {

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

类似地,业务逻辑可以被放置为背加压流处理阿卡流的内部:

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

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


文章来源: Scala/akka discrete event simulation