2

私は、Akka のように失敗が第一級市民であるHystrix ランドでかなりの時間を過ごした後、Akka に来ています。

Hystrix では、インスタンスを RDB (MySQL など) に保存SaveFizzToDbCmdしようとする.ダウン/失敗し始めます:FizzSaveFizzToMemoryCmdFizz

// 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 の例は非常に高く評価されています!

4

1 に答える 1

0

1 つの方法は、FailoverPersistorコードを消費するアクターを使用することです。アクターは、子として aJdbcPersistorと a の両方を持ち、どちらInMemoryPeristorを使用するかを決定し、状態に応じてトラフィックを基本的に正しい子にルーティングするフラグを持ちます。フラグは、アクター内のスーパーバイザーとタイミング ロジック/統計の両方で操作できます。

akka の contrib パッケージにはサーキット ブレーカーがあります

于 2015-09-05T11:27:11.147 に答える