Akka和ReactiveMongo

Ale*_*x K 9 scala mongodb actor akka reactivemongo

我试图找到在集群工作者之间共享同一个连接池的最佳方法.我有以下结构:

主演员 - >工作人员(最多可达100人) - > MongoDB

在worker和MongoDB之间我想放置reactivemongo,但是我不确定如何在所有actor之间提供连接池共享.

根据reactivemongo文档:

MongoDriver实例管理一个actor系统; 连接管理连接池.通常,MongoDriver或创建MongoConnection永远不会多次实例化.您可以提供一个或多个服务器的列表; 驱动程序将猜测它是独立服务器还是副本集配置.即使有一个副本节点,驱动程序也会探测其他节点并自动添加它们.

我应该在Master actor中创建它然后捆绑每条消息吗?所以,这将是主演员:

val driver = new MongoDriver
val connection = driver.connection(List("localhost"))
Run Code Online (Sandbox Code Playgroud)

然后我将连接传递给消息中的actor.或者我应该查询每个Work Actor中的连接并在消息中仅传递驱动程序?

非常感谢任何帮助.谢谢.

cmb*_*ter 14

我会创建driverconnection主演员.然后,我将设置worker actor MongoConnection作为构造函数参数的实例,以便每个worker都有一个对连接的引用(它实际上是连接池的代理).然后,在类似的东西preStart,让主演员创建工人(我假设被路由)并提供连接作为arg.一个非常简单的示例可能如下所示:

class MongoMaster extends Actor{
  val driver = new MongoDriver
  val connection = driver.connection(List("localhost"))

  override def preStart = {
    context.actorOf(Props(classOf[MongoWorker], connection).withRouter(FromConfig()))
  } 

  def receive = {
    //do whatever you need here
    ...
  }
}

class MongoWorker(conn:MongoConnection) extends Actor{
  def receive = {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

这段代码并不精确,但至少它显示了我所描述的高级概念.


mha*_*ttu 6

只要您不需要远程实例化worker actor,cmbaxter的答案就会起作用.MongoConnection不可序列化.

我发现这篇文章https://github.com/eigengo/akka-patterns/wiki/Configuration非常有帮助.基本思想是实现一个名为Configured的特性,它由主应用程序填充.然后,actor可以使用该特征来访问本地的,不可序列化的对象,例如MongoConnection.