Ale*_*x K 9 scala mongodb actor akka reactivemongo
我试图找到在集群工作者之间共享同一个连接池的最佳方法.我有以下结构:
主演员 - >工作人员(最多可达100人) - > MongoDB
在worker和MongoDB之间我想放置reactivemongo,但是我不确定如何在所有actor之间提供连接池共享.
根据reactivemongo文档:
MongoDriver实例管理一个actor系统; 连接管理连接池.通常,MongoDriver或创建MongoConnection永远不会多次实例化.您可以提供一个或多个服务器的列表; 驱动程序将猜测它是独立服务器还是副本集配置.即使有一个副本节点,驱动程序也会探测其他节点并自动添加它们.
我应该在Master actor中创建它然后捆绑每条消息吗?所以,这将是主演员:
val driver = new MongoDriver
val connection = driver.connection(List("localhost"))
Run Code Online (Sandbox Code Playgroud)
然后我将连接传递给消息中的actor.或者我应该查询每个Work Actor中的连接并在消息中仅传递驱动程序?
非常感谢任何帮助.谢谢.
cmb*_*ter 14
我会创建driver和connection主演员.然后,我将设置worker actor MongoConnection作为构造函数参数的实例,以便每个worker都有一个对连接的引用(它实际上是连接池的代理).然后,在类似的东西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 = {
...
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码并不精确,但至少它显示了我所描述的高级概念.
只要您不需要远程实例化worker actor,cmbaxter的答案就会起作用.MongoConnection不可序列化.
我发现这篇文章https://github.com/eigengo/akka-patterns/wiki/Configuration非常有帮助.基本思想是实现一个名为Configured的特性,它由主应用程序填充.然后,actor可以使用该特征来访问本地的,不可序列化的对象,例如MongoConnection.
| 归档时间: |
|
| 查看次数: |
3544 次 |
| 最近记录: |