【问题标题】:Akka and ReactiveMongoAkka 和 ReactiveMongo
【发布时间】:2013-09-09 10:05:15
【问题描述】:

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

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

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

根据 reactivemongo 文档:

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

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

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

然后我在消息中将连接传递给演员。还是应该在每个 Work Actor 中查询一个连接并在消息中只传递驱动程序?

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

【问题讨论】:

    标签: mongodb scala akka actor reactivemongo


    【解决方案1】:

    我会在主演员中创建driverconnection。然后,我将设置工作角色以将 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 = {
        ...
      }
    }
    

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

    【讨论】:

    • 感谢您的回答,这看起来不错,我会试一试。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多