Java Akka和后备/后备参与者
我来到阿卡是因为我花了很多时间在那里,就像阿卡一样,失败是一等公民 在Hystrix中,我可能有一个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
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.
}