9

アクター間で同じ接続プールをクラスター ワーカーと共有するための最良の方法を見つけようとしています。私は次の構造を持っています:

マスター アクター -> ワーカー アクター (最大 100 個以上) -> MongoDB

ワーカーと MongoDB の間には、reactivemongo を配置したいと考えていますが、すべてのアクター間で接続プールを共有する方法が正確にはわかりません。

リアクティブモンゴのドキュメントによると:

MongoDriver インスタンスはアクター システムを管理します。接続は、接続のプールを管理します。一般に、MongoDriver または MongoConnection の作成は、一度しかインスタンス化されません。1 つ以上のサーバーのリストを提供できます。ドライバーは、それがスタンドアロン サーバーであるか、レプリカ セット構成であるかを推測します。レプリカ ノードが 1 つの場合でも、ドライバーは他のノードをプローブして自動的に追加します。

マスターアクターで作成してから、各メッセージにバンドルする必要がありますか? したがって、これはマスター アクターでは次のようになります。

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

そして、メッセージでアクターに接続を渡します。または、各ワーク アクターで接続をクエリし、ドライバーだけをメッセージに渡す必要がありますか?

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

15

マスター アクターにdriverandを作成します。次に、各ワーカーが接続 (実際には接続のプールへのプロキシ) への参照を持つように、コンストラクターの引数としてconnectionのインスタンスを取るようにワーカー アクターを設定します。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 = {
    ...
  }
}

このコードは正確ではありませんが、少なくとも私が説明した高レベルの概念を示しています。

于 2013-09-05T15:08:13.070 に答える