Java Akka和后备/后备参与者

Java Akka和后备/后备参与者,java,akka,hystrix,fault-tolerance,akka-supervision,Java,Akka,Hystrix,Fault Tolerance,Akka Supervision,我来到阿卡是因为我花了很多时间在那里,就像阿卡一样,失败是一等公民 在Hystrix中,我可能有一个savefizztomorycmd尝试将Fizz实例保存到RDB(MySQL,无论什么),还有一个备份/“fallback”savefizztomorycmd将Fizz保存到内存缓存中,以防主(DB)命令停止/开始失败: // Groovy pseudo-code class SaveFizzToDbCmd extends HystrixCommand<Fizz> { Save

我来到阿卡是因为我花了很多时间在那里,就像阿卡一样,失败是一等公民

在Hystrix中,我可能有一个
savefizztomorycmd
尝试将
Fizz
实例保存到RDB(MySQL,无论什么),还有一个备份/“fallback”
savefizztomorycmd
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()
    }
}
我正在努力解决的问题是:

  • 当出现故障时,如何在MemoryPersistor中正确配置/连接
    作为
    JdbcPersistor
    的备份;及
  • 如果/当JdbcPersistor“治愈”(尽管可能永远不会)时,将故障切换回JdbcPersistor
我想这是属于
JdbcPersistors
SupervisorStrategy
内部的逻辑,但我在Akka文档中找不到任何实现这种行为的代码片段。这告诉我“嘿,也许这不是Akka的工作方式,也许在Akka的土地上有一种不同的方式来进行这种断路/故障切换/回切。”你有什么想法


请注意:Java示例非常受欢迎,因为Scala在我看来就像是象形文字

一种方法是使用一个
FailoverPersistor
执行器,它与消费代码的执行器进行通信,同时将
jdbc持久器和
InMemoryPeristor
作为子对象,并具有一个标志,该标志决定使用哪一个,然后根据状态基本上将通信路由到正确的子对象。然后,主管和参与者内部的定时逻辑/统计都可以操纵该标志

akka的contrib软件包中有一个断路器,它可能是一个灵感来源(或者甚至可以用来实现您的目标):

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.
}