2017-04-04 16 views
0

私は俳優が永続的であることを知っています。何もしない限り(メールボックスにメッセージなし)、メールは常に監視されます。各アクタのメールボックスは誰が監視していますか?

俳優自身ですか?メッセージを持つまでディスパッチャから割り当てられたスレッドはありません。

または、各アクターのメールボックスを監視しているバックグラウンドデーモンはありますか?

+1

俳優は執拗ではありません。しかし、あなたは俳優に永続性を加えることができます。そして、俳優たちはアイドル状態で座っていません(彼らは実際の作業部分ではありません)。それだけで彼らは糸で握られていません。また、メールボックスはディスパッチャによって所有されています。 –

+0

ディスパッチャはアクターのメールボックスを監視していますか? – RBanerjee

+0

実際にメールボックスがディスパッチャによって所有されているのは、ほとんど不正確です。しかし、ここで「監視」することはどういう意味ですか? –

答えて

1

@Sarvesh Kumar Singhが述べたように、俳優はデフォルトでは永続的ではありません。永続アクタを作成するには、PersistentActor:Akka Persistenceを拡張します。 アクターシステム階層でアクター(セル)が作成されると、そのメールボックス(MailboxはRunnableのサブクラスです)がディスパッチャーに接続され、アクターが開始されると、ディスパッチャーはメールボックス実行可能メッセージがあれば、定義されたアクターの受信メソッドをトリガーしてメッセージを実際に処理します。メッセージループ(この実行中に、このバッチのバッチを処理するとディスパッチャのスループット設定の制限を超えない場合、キュー内のメッセージはバッチ処理されます)は、processMailBoxの再帰呼び出しによってrunメソッドでも行われますメールボックスに保存します。各ラウンドの終わりに、メールボックスが実行のためにディスパッチャスレッドプールにアタッチされます。メッセージがある場合は、アクターメールボックスの実行がスケジュールされ、ループが続行されます。そうでない場合は、ループが壊れ、アクターにメッセージが送信されたときに次の実行がスケジュールされます。この時点で、actorRefを呼び出すと、アクターセルに添付されたディスパッチャを介してメッセージが送出されます。これにより、ディスパッチャはメッセージ処理をスケジュールするようになります。これは、Dispatch::sendMessageDispatcher::dispatchを確認してください。 Dispatchersで説明したように、ディスパッチャのスループットは、スレッドが次のアクタにジャンプする前に、アクタごとに処理されるメッセージの最大数を決定するように設定できます。

+0

さて、メッセージがなく、1000人のアクターがいるとします。 Dispatcherは1000個のメールボックスをポーリングするだけです。 ?それは...ですか ? – RBanerjee

+0

いいえ。アクターにメッセージがない場合、アクター実行メソッドは再びスケジュールされません。実行ファイルはディスパッチャのスレッドプールにキューイングされません。このアクターセルに添付されたディスパッチャーを介して、次のメッセージがアクターに送られます。この時点で、ディスパッチャーはアクターのメッセージ処理の実行をスケジュールします。私はそれをもっと明確にするために答えを編集します。 –

+1

実際には、ディスパッチャはメールボックスを「監視」していません.Akka俳優の実装では、メッセージを俳優に送ったときに実際にバックエンドのエントリポイントになります。 –

関連する問題