[英]Akka and Backup/Fallback Actors
我花了很多时间在Hystrix-land (像Akka一样,失败是一流的公民)之后来到Akka。
在Hystrix中,我可能有一个SaveFizzToDbCmd
试图将Fizz
实例保存到RDB(MySQL等)中,还有一个备份/“ 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()
}
}
在猬,如果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.