使用参与者模型为数据库插入引入并发性的好模型是什么



更多详细信息: 我是Scala和Akka的新手。 我正在尝试构建一个并发系统,本质上可以做到这一点-

  • 读取 CSV 文件
  • 将其解析为组
  • 然后加载到表中。

该文件不能拆分为较小的文件,因此我将使用正常的标准序列化读取。我将信息传递给大师(演员)。我动态创建 n 个称为编写器的参与者,并将此信息的大块传递给他们。现在,每个编写器实际上负责读取数据,对其进行分类,然后插入到适当的表中。

我的怀疑是,当两个作家同时在桌子上写作时,是否会导致竞争条件。此外,如何以更好的方式对此问题进行建模以提高速度。任何方向的任何帮助都将非常有用。谢谢

数据访问建模

我发现设计这种任务的最大关键是抽象出数据库。 应将任何数据库更新视为返回成功或失败的简单函数:

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 流而不是原始 Actor。 可以在此处找到使用流范例的解决方案。

阿卡演员

Actor解决方案也是可能的:

val UpdateActor(updater : Updater) extends Actor {
override def receive = {
case data : Data => sender ! updater(data)
}
}

Actor的问题在于,您必须编写一个Actor来读取文件,编写其他Actor来对行进行分组,最后使用UpdateActor将数据发送到数据库。 你还需要将所有这些Actor连接在一起......

最新更新