9

我正在尝试找到在参与者与集群工作人员之间共享相同连接池的最佳方法。我有以下结构:

Master Actor -> Worker Actors(最多 100 个或更多)-> MongoDB

在工作人员和 MongoDB 之间,我想放置响应式mongo,但是我不确定如何在所有参与者之间提供连接池共享。

根据reactivemongo文档:

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

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

val driver = new MongoDriver
val connection = driver.connection(List("localhost"))

然后我在消息中将连接传递给演员。或者我应该查询每个工作参与者中的连接并在消息中只传递驱动程序?

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

4

2 回答 2

15

我会在主actor中创建driverand 。connection然后,我将设置工作角色以将 的实例MongoConnection作为构造函数参数,以便每个工作人员都有对连接的引用(这实际上是连接池的代理)。然后,在类似的情况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 = {
    ...
  }
}

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

于 2013-09-05T15:08:13.070 回答
6

只要您不需要远程实例化工作角色,cmbaxter 的答案就可以工作。MongoConnection 不可序列化。

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

于 2014-02-20T09:10:26.890 回答