1

キューアイテムの並列処理にScalaでAkkaアクターを使用しています。10個の再利用可能な子ProcessorActorsを持つMasterActorがあります。

処理されるアイテムは、赤、青、緑のアイテムなど、さまざまなタイプにすることができます。ある時点では、特定のタイプの単一のアイテムのみを処理できます。したがって、1つの赤のアイテムが処理されている場合、それ以上の赤を同時に処理することはできません。

すべて問題ありませんが、アプリに適切なフォールトトレランスを実装しようとすると、終了メッセージで失敗したアイテムタイプに関する情報をあまり取得できません。ProcessorActorが失敗した場合、MasterActorで適切なタイプを処理可能としてマークする必要があります。失敗したアイテムタイプを取得できないため、今は行き詰まっています。終了メッセージにActorRefがありますが、そのメッセージを受け取った直後にActorRefにメッセージを送信するのはよくありません。

結局、私は「処理中」とマークされたすべての可能なタイプを残すことができますが、実際にはそれらの適切なアクターが死んでいるだけです。

ご意見をお聞かせください。

4

4 に答える 4

1

Terminated子供に新しいジョブを提供しないという「一時停止」フラグを設定し、ProcessorActorsアクティブなジョブがある場合はすべてにpingを実行し、ジョブを割り当てることができる場合は、ジョブを割り当てて「一時停止」フラグを解放します。その「一時停止」フラグが設定されているときに受信が終了した場合は、もう一度pingを実行します。

于 2013-03-18T23:01:01.337 に答える
1

赤のアクター、青のアクター、緑のアクターを持つようにアーキテクチャを再設計し、アクターの障害が停止するのではなく再起動するように監視戦略を設定するだけで、やりたいことが達成できるようです。本当に簡単です。終了メッセージを自分で処理する必要もありません。

于 2013-03-19T10:01:43.750 に答える
0

さて、私がついにやったことと、何が一番良さそうだったか。ProcessorActor失敗時に再起動ポリシーを設定し、そのpreRestart中でメソッドを処理します。reason:Option[Any]空ではなく一致する場合はStartProcessingMessage(Item(ItemType))、にを送信ProcessingFailedMessage(Item(ItemType))senderます。次に、スーパーバイザアクターはタイプを未処理としてマークし、次のループは、失敗して再起動されたばかりのループでさえ、while処理を開始します。ProcessorActor

于 2013-03-20T08:57:55.870 に答える
0

アイテムの処理を開始する直前にProcessorActor、(アイテムのタイプを含む)メッセージを送信できます。MasterActorあなたの中であなたはあなたが(メッセージで受け取られた)死ぬときに処理されている最後のアイテムタイプによって決定することができる使用法をMasterActor維持することができます。Map[ActorRef, ItemType]ActorRefTerminatedProcessorActor

于 2013-03-19T08:48:44.707 に答える