我在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,我们可能有一个JdbcPersistor
Actor 和一个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 在我看来就像象形文字!