首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka和ReactiveMongo

Akka和ReactiveMongo
EN

Stack Overflow用户
提问于 2013-09-05 14:07:33
回答 2查看 3.7K关注 0票数 9

我正在努力寻找最佳方法,在集群工作人员之间共享相同的连接池。我的结构如下:

主Actor -> Worker Actors(最多可达100或更多) -> MongoDB

在员工和MongoDB之间,我想把reactivemongo放在一起,但是我不确定如何在所有参与者之间提供连接池共享。

根据reactivemongo文件:

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

我是否应该在主演员中创建它,然后将每一条信息捆绑在一起?所以,这将是在大师演员:

代码语言:javascript
复制
val driver = new MongoDriver
val connection = driver.connection(List("localhost"))

然后我在一条信息中传递给演员们的联系。或者我应该在每个Work Actor中查询一个连接并在消息中传递驱动程序?

任何帮助都是非常感谢的。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-05 15:08:13

我将在主演员中创建driverconnection。然后,我将设置worker参与者,将MongoConnection的一个实例作为构造函数参数,以便每个工作人员都有对连接的引用(这实际上是连接池的代理)。然后,在类似于preStart的内容中,让主演员创建工作人员(我假设这是路由的),并以arg的形式提供连接。一个非常简单的示例可以如下所示:

代码语言:javascript
复制
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 = {
    ...
  }
}

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

票数 15
EN

Stack Overflow用户

发布于 2014-02-20 09:10:26

cmbaxter的答案是有效的,只要您不需要远程实例化工作人员。MongoConnection是不可序列化的。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18638570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档