更多细节: 我是Scala和Akka的新手。 我正在尝试构建一个基本上这样做的并发系统 -
该文件无法拆分为较小的文件,因此我将使用正常的标准序列化读取。我把信息传递给了一位大师(演员)。我动态创建了许多名为writer的actor,并传递了这些信息的大块。现在每个作者都负责读取数据,对它们进行分类,然后插入适当的表格。
我怀疑的是,当两位作家同时写在桌面上时,会导致竞争条件。此外,如何以更好的方式模拟这个问题以提高速度。任何方向的任何帮助都非常有用。感谢
答案 0 :(得分:0)
建模数据访问
我发现设计此类任务的最大关键是抽象出数据库。您应该将任何数据库更新视为返回成功或失败的简单函数:
type UpdateResult = Boolean
val UpdateSuccess : UpdateResult = true
val UpdateFailure : UpdateResult = false
type Data = ???
type Updater = (Data) => UpdateResult
这允许您编写一个Updater
,它将转到实际的数据库或始终返回成功的测试更新程序:
val statement : Statement = ???
val dbUpdater : Updater = (data) => {
statement.executeQuery(s"INSERT INTO ... ${data.toString}")
}
val testUpdater : Updater = _ => UpdateSuccess
Akka Stream实施
对于这个特殊用例,我推荐使用akka流而不是原始Actors。使用流范例can be found here的解决方案。
Akka演员
也可以使用Actor解决方案:
val UpdateActor(updater : Updater) extends Actor {
override def receive = {
case data : Data => sender ! updater(data)
}
}
Actors的问题在于你必须编写一个Actor来读取文件,其他Actors来编写行,最后使用UpdateActor
将数据发送到db。你还必须把所有这些演员连在一起......