簡體   English   中英

Akka和備用/后備演員

[英]Akka and Backup/Fallback Actors

我花了很多時間在Hystrix-land (像Akka一樣,失敗是一流的公民)之后來到Akka。

在Hystrix中,我可能有一個SaveFizzToDbCmd試圖將Fizz實例保存到RDB(MySQL等)中,還有一個備份/“ fallbackSaveFizzToMemoryCmd將該Fizz保存到內存中的緩存中,以防使用主(DB)命令失敗/開始失敗:

// 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()
    }
}

在蝟,如果run()拋出一個異常(比如一個SqlException ),其getFallback()方法被調用。 如果在一定時間內引發了足夠多的異常,則HystrixCommands “斷路器”將被“跳閘”,並且僅將調用getFallback()方法。

我有興趣在Akka中完成相同的任務,但需要與演員一起完成。 使用Akka,我們可能會有一個JdbcPersistor actor和一個InMemoryPersistor備份/ fallback actor,如下所示:

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 (盡管可能永遠不會)

猜想這是一個內部屬於邏輯JdbcPersistors SupervisorStrategy ,但我能找到什么在阿卡文檔也實現這種行為的任何代碼段。 這告訴我“ 嘿,也許這不是Akka的工作方式,也許在Akka地區有另一種方法來進行這種電路中斷/故障轉移/故障回復。 有何想法?

請注意 :Java示例非常受贊賞,因為Scala在我看來就像象形文字!

一種方法是讓一個使用代碼的FailoverPersistor actor與之通信,該JdbcPersistor具有一個JdbcPersistor和一個InMemoryPeristor作為子代,以及一個標志,該標志決定使用哪個子代,然后根據狀態基本上將流量路由到正確的子代。 然后可以由主管和參與者內部的定時邏輯/統計信息來操縱該標志。

在akka的contrib軟件包中有一個斷路器可能是一個啟發(或者甚至可以用來實現您想要的): http : //doc.akka.io/docs/akka/current/common/circuitbreaker.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM