如何使用 Akka actor 管理数据库连接?

How do you manage database connections using Akka actors?

我研究 Akka 有一段时间了,我正在构建一个应用程序,它利用 actor 模型并需要保持与数据库的连接,但我有一个难题:我把这个连接放在哪里以及如何才能我管得着吗?

到目前为止我的推理是这样的:

尽管查询是通过 Futures 完成的,但我不禁认为这种模型无法扩展。只有一个线程管理所有数据库访问消息?即使使用 Futures 听起来也不合理。 我想过让 child 工作人员来管理数据库查询,但我必须与 children 共享连接。 我喜欢最后一个想法,因为如果 DatabaseConnection actor 死亡,理论上它的所有 children 也会死亡。但是我不知道是否有另一种更好的方法可以在不共享状态的情况下解决这个问题。有吗?

基于 example code 的响应式 mongo 看起来不需要 Actor 封装。检查代码示例:

val collection = db[BSONCollection]("articles")

val query = BSONDocument()

val cursor = collection.find(query).cursor[BSONDocument]

val futureList = cursor.toList

collection 对象已经像一个封装了 "connection" 状态并用 Future 结果响应 "queries" 的实体。这几乎就是您要创建的 Actor 的确切定义。

将上面的代码包装在 Actor 主体中似乎不会给您带来太多好处...

从当前的 0.12.6 版本开始,ReactiveMongo 本身是基于 Akka 构建的。主要处理组件(安置here一个演员:

trait MongoDBSystem extends Actor {
   ...
}

基本上,ReactiveMongo 已经实现了您想要实现的目标,因此如果您正在使用 ReactiveMongo,那么尝试在您自己的 actor 中处理低级连接细节是没有意义的。

如果您想了解一种使用 actor 来处理连接和服务请求的方法,请研究 ReactiveMongo 的实现。除了上面链接的 MongoDBSystem 特征外,请查看 MongoDriver and MongoConnection classes, as well as the tests in DriverSpec.