2013-09-05 1 views
9

私は、クラスタワーカーとアクター間で同じ接続プールを共有するための最良の方法を見つけることを試みています。 - >ワーカーアクター(100以上まで可能) - > MongoDBのAkkaとReactiveMongo

私はreactivemongo入れたい労働者とMongoDBの間

、しかし、私はわからない方法を正確に

マスター俳優:私は、次のような構造を持っていますすべてのアクター間で接続プールを共有します。

reactivemongoドキュメントによると:

A MongoDriverインスタンスは俳優のシステムを管理します。接続は接続のプールを管理します。一般に、MongoDriverまたはMongoConnectionを作成することは決して複数回インスタンス化されません。 1つまたは複数のサーバーのリストを提供できます。ドライバはスタンドアロンサーバーかレプリカセットの設定かどうかを推測します。 1つのレプリカノードでも、ドライバは他のノードを調べて自動的に追加します。

私はそれをマスターの俳優で作成し、各メッセージにバンドルする必要がありますか? だから、これはマスターの俳優で次のようになります。

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

そして私は、メッセージ中の俳優への接続を渡します。あるいは、私は各Work Actorで接続を照会し、メッセージ内のドライバだけを渡すべきですか?

ご協力いただきありがとうございます。おかげさまで

答えて

14

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

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

+0

あなたの答えをありがとう、これはよさそうだ、私はそれを試してみましょう。 –

6

cmbaxterの回答は、ワーカーアクタをリモートでインスタンス化する必要がない限り機能します。 MongoConnectionは直列化できません。

この記事が見つかりましたhttps://github.com/eigengo/akka-patterns/wiki/Configuration非常に役立ちます。基本的な考え方は、Configuredという特性を実装することです。この特性は、メインアプリケーションによって作成されます。アクターは、その特性を使用して、MongoConnectionなどのローカルで非シリアル化可能なオブジェクトにアクセスすることができます。