2

我在Hystrix-land度过了相当长的一段时间后来到 Akka,在那里,和 Akka 一样,失败是一等公民。

在 Hystrix 中,我可能有一个SaveFizzToDbCmd尝试将Fizz实例保存到 RDB(MySQL 等),以及一个备份/“<em>fallback”SaveFizzToMemoryCmd将其保存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()
    }
}

在 Hystrix 中,如果run()抛出异常(比如 a SqlException),getFallback()就会调用它的方法。如果在一定时间内抛出足够多的异常,HystrixCommands“断路器”就会“跳闸”,只有getFallback()方法会被调用。

我有兴趣在 Akka 中完成相同的任务,但要使用演员。使用 Akka,我们可能有一个JdbcPersistorActor 和一个InMemoryPersistor备份/备用 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如果/何时“治愈”(尽管它可能永远不会)

我想是属于 inside 的逻辑JdbcPersistors SupervisorStrategy,但我在 Akka 文档中找不到任何东西,也找不到任何实现这种行为的代码片段。这告诉我“<em>嘿,也许这不是 Akka 的工作方式,也许在 Akka 领域有一种不同的方式来执行这种断路器/故障转移/故障回复。” 想法?

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

4

1 回答 1

0

一种方法是让一个FailoverPersistor参与者与消费代码进行通信,它同时具有 aJdbcPersistor和 aInMemoryPeristor作为子级,以及一个决定使用哪一个的标志,然后基本上根据状态将流量路由到正确的子级。然后,该标志可以由参与者内部的主管和定时逻辑/统计信息进行操作。

akka 的 contrib 包中有一个断路器,它可能是一个灵感(或者甚至可以用来实现你想要的):http ://doc.akka.io/docs/akka/current/common/circuitbreaker.html

于 2015-09-05T11:27:11.147 回答