[英]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.