我正在努力寻找最佳方法,在集群工作人员之间共享相同的连接池。我的结构如下:
主Actor -> Worker Actors(最多可达100或更多) -> MongoDB
在员工和MongoDB之间,我想把reactivemongo放在一起,但是我不确定如何在所有参与者之间提供连接池共享。
根据reactivemongo文件:
MongoDriver实例管理参与者系统;连接管理连接池。通常,MongoDriver或create MongoConnection的实例化永远不会超过一次。您可以提供一个或多个服务器的列表;驱动程序将猜测它是一个独立的服务器还是一个副本集配置。即使有一个副本节点,驱动程序也会探测其他节点并自动添加它们。
我是否应该在主演员中创建它,然后将每一条信息捆绑在一起?所以,这将是在大师演员:
val driver = new MongoDriver
val connection = driver.connection(List("localhost"))然后我在一条信息中传递给演员们的联系。或者我应该在每个Work Actor中查询一个连接并在消息中传递驱动程序?
任何帮助都是非常感谢的。谢谢。
发布于 2013-09-05 15:08:13
我将在主演员中创建driver和connection。然后,我将设置worker参与者,将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 = {
...
}
}这段代码并不准确,但至少它显示了我描述的高级概念。
发布于 2014-02-20 09:10:26
cmbaxter的答案是有效的,只要您不需要远程实例化工作人员。MongoConnection是不可序列化的。
我发现这篇文章https://github.com/eigengo/akka-patterns/wiki/Configuration非常有用。基本思想是实现一个名为Configured的特性,它由主应用程序填充。然后,参与者可以使用该特性来访问本地的、不可序列化的对象,如MongoConnection。
https://stackoverflow.com/questions/18638570
复制相似问题