我正在尝试找到在集群工作人员之间共享相同连接池的最佳方法。我有以下结构:
Master Actor -> Worker Actors(最多 100 个或更多)-> MongoDB
我想在工作人员和 MongoDB 之间放置reactivemongo,但是我不确定如何在所有参与者之间提供连接池共享。
根据reactivemongo文档:
一个 MongoDriver 实例管理一个 Actor 系统;连接管理连接池。一般来说,MongoDriver 或创建 MongoConnection 永远不会被实例化超过一次。您可以提供一个或多个服务器的列表;驱动程序将猜测它是独立服务器还是副本集配置。即使只有一个副本节点,驱动程序也会探测其他节点并自动添加它们。
我应该在 Master actor 中创建它,然后与每条消息捆绑在一起吗?
所以,这将是演员大师中的:
val driver = new MongoDriver
val connection = driver.connection(List("localhost"))
然后我通过消息将连接传递给参与者。或者我应该查询每个 Work Actor 中的连接并仅在消息中传递驱动程序?
非常感谢任何帮助。
谢谢。
我会创建driver
and connection
在大师演员中。然后我会设置工人演员来获取一个实例MongoConnection
作为构造函数参数,以便每个工作人员都有对连接的引用(这实际上是连接池的代理)。然后,在类似的事情中preStart
,让主参与者创建工作人员(我假设已路由)并将连接作为参数提供。一个非常简化的示例可能如下所示:
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 = {
...
}
}
这段代码并不准确,但至少它显示了我描述的高级概念。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)