繁体   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