問題タブ [akka-supervision]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
actor - Akka.net - コーディネーターによる追加のエラー処理
次のような基本構造を持つ Akka.net ベースのアクター システムがあるとします。
コーディネーター アクターは、使用される監督戦略を定義しDirective.Restart
ます。
子アクターは、いくつかの理由で失敗する可能性があります (たとえば、ArithmeticException
、InvalidOperationException
およびMyCustomException
)。
しかし、子が で失敗した場合MyCustomException
、デフォルトの監視メカニズムを変更せずに何らかの方法で追加で処理できるようにしたいと考えています (再起動のアプローチはここでも機能するはずです)。たとえば、Console.Writeline
例外の詳細を追加します。
どうすれば実装できますか?
exception - トップレベルの Akka アクターのエスカレーションとシャットダウン フッキング
私の Akka システムには、トップレベル (「ルート」) のアクターがInitializer
あり、他のすべてのアクターはそこから来ています。Destroyer
また、メッセージを受信したときにシステムを正常にシャットダウンする役割を担うアクター もありDestroy
ます。Destroy
アクターが に を送信する条件はいくつかありますが、Destroyer
ここではあまり重要ではありません。
に機能を実装したいと思います。その子Initializer
のSupervisorStrategy
1 人によってスローされた失敗/例外を処理できない場合、それを「世界を止める」タイプのイベントとして解釈し、システムを正常にシャットダウンします。 .
私のひざまずく反応はInitializer
、失敗をエスカレートさせることですが、最上位のアクターがエスカレートするとどうなるかわかりません。そのエスカレーションが何らかの方法で を呼び出す方法があればいいのですが、Desroyer
それをすべて接続する方法がわかりません。何か案は?
akka - Akka System Guardian のカスタム スーパーバイザー戦略
System Guardianの Akka docs によると、最上位のアクターが をスローするException
と、無期限に再起動されます (2 つの例外があります - しゃれは意図されていません)。
私のアクター システムには、トップレベルのアクターが 1 つだけあります: Initializer
. 例外がスローされた場合、可能であればInitializer
、別の例外を適用したいと思います。SuervisorStrategy
Initializer
3回まで再起動- それが機能しない場合は、停止/終了します
システム ガーディアンにこのカスタム戦略を実装するにはどうすればよいですか?
java - Akka Futures と Supervisor Strategies が失敗に対処する方法
アッカJavaはこちら。フューチャーを使用した「アスク」パターンに関する Akka ドキュメントを読んだところですが、スーパーバイザー戦略 (ディサイダー) と失敗コールバックの両方が図の一部であるシナリオに関して、いくつかのことがどのように機能するかを理解していません。
子供に尋ねる親
2 つのアクターがいてFizz
、Buzz
がFizz
の親/作成者であるとしBuzz
ます。の親であるため、失敗を処理するFizz
forがあります。Buzz
SupervisorStrategy
Buzz
場合によっては、いくつかのデータFizz
を要求する必要がありBuzz
ます。これが発生すると、次の 3 つの結果のいずれかになります。
Buzz
正常に戻り、 ;を提供GetBuzzDataCallback
します。bData
またBuzz
をスローしBuzzIsAngryException
ます。またBuzz
他の種類の例外/エラーをスローします
後者の2つのケースで何が起こるのか疑問に思っています:
- 例外は誰に、どのような順序で、どのように通知されますか? つまり、引数
GetBuzzDataCallback
として例外が送信されますか?Throwable failure
または、FizzFailureDecider
呼び出されますか?または両方 (コールバックとディサイダー/スーパーバイザー戦略の両方にエラーが渡されると、少し冗長で複雑に見えます)?
子以外に尋ねる親
がの親/作成者でFizz
はないことを除いて、上記と同じシナリオですBuzz
。この場合、 (その引数GetBuzzDataCallback
として) に例外が送信されたと想定できますか?Throwable failure
私の質問の根底にあるのはこれだと思います: スーパーバイザー戦略と将来のコールバックが関係する場合、子例外がスローされたときに誰に通知され、どのような順序で通知されますか? 上で述べたように、両方が失敗/例外を受け取った場合Buzz
、コールバックが例外で何か他のことをしようとしている間にスーパーバイザー戦略が再起動しようとしている可能性があるため、私にとってはさらに混乱します (競合する可能性があります)。
注意: 必須ではありませんが、提供されるコード スニペットが Scala ではなくJava である場合は、非常にありがたいです(Scala は私には象形文字のように見えます)。
java - Akka とバックアップ/フォールバック アクター
私は、Akka のように失敗が第一級市民であるHystrix ランドでかなりの時間を過ごした後、Akka に来ています。
Hystrix では、インスタンスを RDB (MySQL など) に保存SaveFizzToDbCmd
しようとする.ダウン/失敗し始めます:Fizz
SaveFizzToMemoryCmd
Fizz
Hystrix ではrun()
、例外 (たとえば a SqlException
) がスローされると、そのgetFallback()
メソッドが呼び出されます。一定時間内に十分な数の例外がスローされると、HystrixCommands
「サーキット ブレーカー」が「作動」し、getFallback()
メソッドのみが呼び出されます。
私は Akka で同じことを達成することに興味がありますが、アクターを使用します。Akka では、次のようなJdbcPersistor
アクターとInMemoryPersistor
バックアップ/フォールバック アクターを使用できます。
私が苦労している問題は次のとおりです。
- 障害が発生した場合
InMemoryPeristor
のバックアップとして正しく構成/配線する方法;JdbcPersistor
と - 「回復」した場合にフェールバックする
JdbcPersistor
(回復しない場合もあります)
これは 内に属するロジックだと思いますが、 AkkaJdbcPersistors
SupervisorStrategy
のドキュメントにも、この種の動作を実装するコード スニペットにも何も見つかりません。これは、「ねえ、これは Akka の動作方法ではないかもしれません。Akka ランドでは、この種のサーキット ブレーカー/フェールオーバー/フェールバックを行う別の方法があるかもしれません。」考え?
注意: Scala は私には象形文字のように見えるので、Java の例は非常に高く評価されています!
java - Akka で再起動されたアクターによるメッセージの永続化と再生
アッカJavaはこちら。私は 2 つのアクター と を持っていParent
ますChild
。前者は後者の親です。Child
特定の例外 (たとえば、 ) をスローする場合UnrulyTeenagerExcepton
、私が探している動作は次のとおりです。
- は、例外がスローされたとき
Parent
に処理されていたメッセージへの参照を保存します。Child
それから Child
が再起動され、永続化されたメッセージが に「再生」されChild
ます。しかし- この保存 -> 再起動 -> 再生サイクルが 3 回発生し、
Child
スローがUnrulyTeenagerException
3回発生した場合、SupervisorStrategy.escalate()
これまでの私の最善の試み:
しかし、ご覧のとおり、メッセージの永続性と再生に苦労しています。何か案は?Java コード サンプルは非常に高く評価されています。Akka は、Scala の象形文字を学習しなくても十分に頑丈です。