1

私は Akka を初めて使用し、同時実行アプリケーションを作成しています。redis リストを待機し、アイテムが利用可能になったらそれを処理するか、別のアクターに送信してそれを処理するアクターを実装する良い方法は何か疑問に思っています。処理する?

ブロッキング関数 BRPOPLPUSH を使用する方が良いでしょうか? それともアクターに redis を毎秒ポーリングするように依頼するスケジューラーの方が良い方法でしょうか?

また、通常のシステムでは、システムが提供するすべてのリソースを消費することなく、これらのアクターをいくつ同時にスポーンできますか? アクター システムが実行中のシステムで処理できる各アクター タイプの数をどのように決定しますか?

4

2 に答える 2

0

BRPOPLPUSH長時間(指定したタイムアウトまで)ブロックするため、代わりにブロックするScheduler代わりに、1秒ごとに短い時間でブロックすることをお勧めします。

どちらの方法でも、ブロッキングしているため、ブロッキング ライブラリを操作する方法について説明している Akka ドキュメントのこのセクションを読む必要があります。

項目を redis に挿入するコードを制御できますか? その場合、そのコードを取得して akka コードにメッセージを送信し (おそらく akka camel サポートを使用して ActiveMQ 経由で)、項目が redis に挿入されたときに通知することができます。これは、よりイベント駆動型の作業方法であり、非常に長期間にわたってポーリングまたはブロックする必要がなくなります。

于 2012-12-09T14:09:23.347 に答える
0

経験則として、 内で決してブロックしないでくださいreceive。各アクターは CPU のみに依存し、待機、スリープ、または I/O のブロックを行うべきではありません。これらの条件が満たされると、同時に動作する何百万ものアクターを作成できます。各アクターには 600 ~ 650 バイトのメモリ フットプリントがあると想定されています (参照: Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM )。

主な質問に戻ります。残念ながら、Akka の哲学と「互換性がある」、つまり完全に非同期な公式の Redis クライアントはありません。必要なのは、ブロックする代わりにFuture何らかのオブジェクトを返し、結果が利用可能になったときにコールバックを登録できるクライアントです。Perl や node.js などのクライアントがあります。

しかし、役に立つと思われるfyrie-redis独立プロジェクトを見つけました。同期クライアントにバインドされている場合、最善の方法は次のいずれかです。

  • ブロックせずに定期的に Redis をポーリングし、Redis 応答または

  • アクター内でブロックし、結果を理解する

こちらもご覧ください

于 2012-12-02T10:02:48.463 に答える