我正在考虑迁移大型代码库Scala和撬动阿卡Actor模型。 我遇到了以下问题的概念几乎立刻:
在现有的代码的基础上,业务逻辑是使用离散事件模拟(DES)等的SimPy与确定的结果进行测试。 虽然实时程序的运行HOUS的DES需要几分钟的时间。 实时系统可以是异步的,不需要按照测试设置的确切顺序。 我想利用相同的阿卡码两种测试设置和实时设置。 可这在斯卡拉+阿卡可以实现吗?
我曾幻想过与中央消息队列演员的想法 - 但觉得这不是正确的做法。
我正在考虑迁移大型代码库Scala和撬动阿卡Actor模型。 我遇到了以下问题的概念几乎立刻:
在现有的代码的基础上,业务逻辑是使用离散事件模拟(DES)等的SimPy与确定的结果进行测试。 虽然实时程序的运行HOUS的DES需要几分钟的时间。 实时系统可以是异步的,不需要按照测试设置的确切顺序。 我想利用相同的阿卡码两种测试设置和实时设置。 可这在斯卡拉+阿卡可以实现吗?
我曾幻想过与中央消息队列演员的想法 - 但觉得这不是正确的做法。
解决你所说的问题的一般方法是你的“商业逻辑”,从阿卡代码隔离。 这使得业务代码进行单元测试,测试活动,独立阿卡它也可以让你写的很瘦阿卡代码。
举个例子,说你的业务逻辑是处理一些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)