2017-09-13 10 views
0

私はしばらくの間、Akkaを勉強していました。アクターモデルを利用し、データベースとの接続を維持する必要のあるアプリケーションを構築していますが、私はジレンマがあります。 ?Akkaアクタを使用してデータベース接続をどのように管理しますか?

これは、これまでのところ、私の推論です:

  • 接続が一度だけ初期化する必要があります。
  • 接続は状態を表すため、アクター内に存在する必要があります。このアクタのDatabaseConnectionを(単に創造的なものに)呼びましょう。
  • 私は俳優の状態を共有したくないので、すべての質問はこの俳優の内部で行われるべきです。
  • 私が使用しているデータベースドライバはreactive-mongoですので、各クエリは送信者にパイプすることができる未来を返します。

Futuresを使用してクエリを実行しても、このモデルが拡大縮小できないと考えることはできません。すべてのデータベースアクセスメッセージを管理するスレッドは1つだけですか?先物を利用しても不合理に聞こえる。 私は子供の作業者にデータベースクエリを管理させることを考えましたが、私は子供との関係を共有しなければなりません。 私はこの最後のアイデアが気に入っています。なぜなら、DatabaseConnectionアクタが死ぬと、すべての子どもも理論上死ぬからです。しかし、状態を共有せずにこの問題を解決するもう一つの良い方法があるかどうかはわかりません。ある?

+0

[AkkaとReactiveMongo](https://stackoverflow.com/questions/18638570/akka-and-activeMongo)の可能な複製 – cvargascr

+0

[ReactiveMongo:単一の接続プールインスタンスと複数の接続プールインスタンスと複数の接続プールとの重複の可能性があります](https://stackoverflow.com/questions/45859204/reactivemongo-single-connection-pool-instance-vs-many-connection-pool-instances) – cchantep

答えて

0

反応性のあるmongoのexample codeに基づいて、アクターのカプセル化が必要なようには見えません。サンプルコードを調べる:

val collection = db[BSONCollection]("articles") 

val query = BSONDocument() 

val cursor = collection.find(query).cursor[BSONDocument] 

val futureList = cursor.toList 

collectionオブジェクトが既に「接続」の状態をカプセル化しFuture結果と「クエリ」に応答するエンティティのように作用します。これは、作成しようとしていたActorの定義とほぼ同じです。俳優の身体の内部に上記のコードをラップ

ははるかにあなたを購入していないようです...

0

ReactiveMongoは、現在のバージョン0.12.6のように、アッカの上に構築され、それ自体です。 (hereを収納された)、メイン処理コンポーネントは俳優である:

trait MongoDBSystem extends Actor { 
    ... 
} 

は基本的には、ReactiveMongoはすでにあなたが達成しようとしているものを実装していますので、あなたはReactiveMongoを使用している場合、対処しようとするにはポイントがありませんあなた自身の俳優の低レベルの接続の詳細と一緒に。

アクターを使用して接続を処理し、要求を処理する方法の1つを理解したい場合は、ReactiveMongoの実装を検討してください。上にリンクされたMongoDBSystemの特性に加えて、MongoDriverMongoConnectionのクラスと、DriverSpecのテストをチェックしてください。

関連する問題