簡體   English   中英

Akka期貨和監管策略如何應對失敗

[英]How Akka Futures and Supervisor Strategies deal with failure

Akka Java在這里。 我剛才讀的阿卡文檔使用期貨“問”的格局 ,我不理解幾件事情是如何工作的,相對於情景當兩個主管戰略(決策者)和失敗回調是圖片的一部分。

父母問孩子

說我有兩個演員, FizzBuzz ,其中Fizz是的父/創作者Buzz 因為FizzBuzz的父母,所以它有一個針對BuzzSupervisorStrategy來處理其失敗:

// Groovy pseudo-code
class Fizz extends UntypedActor {
    ActorRef buzz

    // Contstructor omitted for brevity, but Buzz is the child of
    // Fizz.

    @Override
    void onReceive(Object message) {
        if(message instanceof FizzRequest) {
            FizzRequest fReq = message as FizzRequest

            // Exceptions thrown here (inside of Buzz) will be
            // handled by Fizz’s supervisor strategy.
            Future<BuzzData> bDataFut = Patterns.ask(buzz,
                fReq.buzzRequest, 500)
            bDataFut.onComplete(new GetBuzzDataCallback())

            // etc.
        } else {
            unhandled(message)
        }
    }

    @Override
    SupervisorStrategy supervisorStrategy() {
        new FizzSupervisorStrategy()
    }
}

class Buzz extends UntypedActor {
    // …etc.
}

class FizzDecider extends Function<Throwable,Directive> {
    @Override
    Directive apply(Throwable throwable) {
        if(throwable instanceof BuzzIsAngryException) {
            return SupervisorStrategy.restart()
        }

        SupervisorStrategy.stop()
    }
}

class FizzSupervisorStrategy extends OneForOneStrategy {
    FizzSupervisorStrategy() {
        super(true, new FizzDecider())
    }
}

class GetBuzzDataCallback extends OnComplete<BuzzData> {
    @Override
    void onComplete(Throwable failure, BuzzData bData) {
        if(failure != null) {
            // If Buzz is the child of Fizz, does this code execute, or
            // just the FizzDecider above? Or both? I’m so confused!
        } else {
            // Handle success. Likely use an ‘Inbox’ to send
            // ‘bData’ back to Fizz.
        }
    }
}

有時, Fizz需要詢問Buzz一些數據。 發生這種情況時,可能會有以下三種結果之一:

  1. Buzz成功返回,並為GetBuzzDataCallback提供bData 要么
  2. Buzz引發BuzzIsAngryException ; 要么
  3. Buzz引發其他異常/錯誤

我想知道后兩種情況會發生什么:

  • 誰以什么順序,如何被通知該異常? 換句話說, GetBuzzDataCallback將異常作為其Throwable failure參數發送了? 或者,是否調用了FizzFailureDecider 或兩個(好像有點多余,如果這兩個回調和決勝局/主管戰略傳遞錯誤復雜化)?

父母問非孩子

與上述相同,但是現在Fizz 不是 Buzz的父/創建者。 在這種情況下,我可以僅假設GetBuzzDataCallback被發送了異常(作為其Throwable failure參數)嗎?

我想我的問題的根源是:當涉及主管策略將來的回調時,在引發子異常時,誰會收到通知,並且順序是什么? 如前所述,對我來說,如果兩者都收到失敗/異常,那將更加令人困惑,因為那樣的話,您可能會有一個主管策略來嘗試重新啟動Buzz而回調則試圖對該異常執行其他操作(可能會發生沖突)。

請注意 :雖然當然不是必需的,但是如果提供的任何代碼段都使用Java而不是 Scala編寫,我將不勝感激(Scala在我看來像象形文字)!

Ask所做的基本上是啟動一個臨時參與者,該參與者將成為消息的發送者,以便收件人進行答復時,它將最終到達該臨時參與者。 臨時演員創建一個Promise並將其Future贈送給調用者。 如果答復在給定的超時之前到達,則臨時Promise將以成功的結果完成Promise

監督總是發生在參與者中,並且由於使用參與者來實施問詢,因此與向其他隨機參與者發送信息使監督工作有所不同的交互相比,交互沒有什么不同。

在您的情況下,異常會冒泡給父級演員,以便它可以監督孩子。 然后,除非你以某種方式發送該故障引發的回復消息,超時將達到和臨時ask -actor將與失敗以后AskTimeoutException

因此,由於這種失敗將通過兩種方式到達父母,因此,將“問”模式與父母與孩子進行溝通通常不是一個好主意。

暫無
暫無

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

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