私は、Akka のように失敗が第一級市民であるHystrix ランドでかなりの時間を過ごした後、Akka に来ています。
Hystrix では、インスタンスを RDB (MySQL など) に保存SaveFizzToDbCmd
しようとする.ダウン/失敗し始めます:Fizz
SaveFizzToMemoryCmd
Fizz
// Groovy pseudo-code
class SaveFizzToDbCmd extends HystrixCommand<Fizz> {
SaveFizzToMemoryCmd memoryFallback
Fizz fizz
@Override
Fizz run() {
// Use raw JDBC to save ‘fizz’ to an RDB.
}
@Override
Fizz getFallback() {
// This only executes if the ‘run()’ method above throws
// an exception.
memoryFallback.fizz = this.fizz
memoryFallback.execute()
}
}
Hystrix ではrun()
、例外 (たとえば a SqlException
) がスローされると、そのgetFallback()
メソッドが呼び出されます。一定時間内に十分な数の例外がスローされると、HystrixCommands
「サーキット ブレーカー」が「作動」し、getFallback()
メソッドのみが呼び出されます。
私は Akka で同じことを達成することに興味がありますが、アクターを使用します。Akka では、次のようなJdbcPersistor
アクターとInMemoryPersistor
バックアップ/フォールバック アクターを使用できます。
class JdbcPersistor extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof SaveFizz) {
SaveFizz saveFizz = message as SaveFizz
Fizz fizz = saveFizz.fizz
// Use raw JDBC to save ‘fizz’ to an RDB.
}
}
}
class InMemoryPersistor extends UntypedActor {
// Should be obvious what this does.
}
私が苦労している問題は次のとおりです。
- 障害が発生した場合
InMemoryPeristor
のバックアップとして正しく構成/配線する方法;JdbcPersistor
と - 「回復」した場合にフェールバックする
JdbcPersistor
(回復しない場合もあります)
これは 内に属するロジックだと思いますが、 AkkaJdbcPersistors
SupervisorStrategy
のドキュメントにも、この種の動作を実装するコード スニペットにも何も見つかりません。これは、「ねえ、これは Akka の動作方法ではないかもしれません。Akka ランドでは、この種のサーキット ブレーカー/フェールオーバー/フェールバックを行う別の方法があるかもしれません。」考え?
注意: Scala は私には象形文字のように見えるので、Java の例は非常に高く評価されています!