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

时间:2017-06-04 07:05:19

标签: scala concurrency akka actor

更多细节: 我是Scala和Akka的新手。 我正在尝试构建一个基本上这样做的并发系统 -

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

该文件无法拆分为较小的文件,因此我将使用正常的标准序列化读取。我把信息传递给了一位大师(演员)。我动态创建了许多名为writer的actor,并传递了这些信息的大块。现在每个作者都负责读取数据,对它们进行分类,然后插入适当的表格。

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

1 个答案:

答案 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。你还必须把所有这些演员连在一起......