我一直在研究Akka一段时间,我正在构建一个利用actor模型的应用程序,并且需要保持与数据库的连接,但我有一个两难的境地:我在哪里建立这种连接,我该如何管理它?
这是我到目前为止的推理:
即使查询是通过期货完成的,我也不禁想到这个模型无法扩展。只有一个线程管理所有数据库访问消息?即使利用期货,这听起来也是不合理的。 我曾想过让童工管理数据库查询,但我必须与孩子们分享这种联系。 我喜欢这个最后一个想法,因为如果DatabaseConnection演员死了,理论上它的所有孩子都会死。但我不知道是否有另一种更好的方法来解决这个问题而不共享状态。有吗?
答案 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
特征,请查看MongoDriver
和MongoConnection
类以及DriverSpec
中的测试。