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

时间:2017-09-13 19:00:33

标签: scala akka reactivemongo

我一直在研究Akka一段时间,我正在构建一个利用actor模型的应用程序,并且需要保持与数据库的连接,但我有一个两难的境地:我在哪里建立这种连接,我该如何管理它?

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

  • 连接只应初始化一次。
  • 由于连接代表一个状态,它应该驻留在一个actor中。让我们称这个演员为DatabaseConnection(只是为了有创意)。
  • 由于我不想分享演员的状态,所有查询都应该在这个演员身上发生。
  • 我使用的数据库驱动程序是reactive-mongo,因此每个查询都会返回一个可以通过管道传送给发件人的Future。

即使查询是通过期货完成的,我也不禁想到这个模型无法扩展。只有一个线程管理所有数据库访问消息?即使利用期货,这听起来也是不合理的。 我曾想过让童工管理数据库查询,但我必须与孩子们分享这种联系。 我喜欢这个最后一个想法,因为如果DatabaseConnection演员死了,理论上它的所有孩子都会死。但我不知道是否有另一种更好的方法来解决这个问题而不共享状态。有吗?

2 个答案:

答案 0 :(得分:0)

基于反应性mongo的example code,它看起来不像Actor封装。检查代码示例:

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

val query = BSONDocument()

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

val futureList = cursor.toList

collection对象已经像一个实体,它封装了"连接的状态。并回应"查询"结果为Future。这几乎就是你想要创造的Actor的确切定义。

将上述代码包含在Actor主体内部似乎并没有给你带来太多......

答案 1 :(得分:0)

ReactiveMongo,截至目前的0.12.6版本,本身就是在Akka上构建的。主要处理组件(容纳here一个actor:

trait MongoDBSystem extends Actor {
   ...
}

基本上,ReactiveMongo已经实现了您尝试实现的目标,因此如果您正在使用ReactiveMongo,那么尝试处理您自己的低级别连接细节毫无意义演员。

如果您想了解使用actor处理连接和提供请求的一种方法,请研究ReactiveMongo的实现。除了上面链接的MongoDBSystem特征,请查看MongoDriverMongoConnection类以及DriverSpec中的测试。