我有一个演员池正在使用的共享外部资源(比如文件存储)。每次对文件存储发出新请求时,都会创建一个新参与者,以使用传入的外部系统的引用来填充请求。
我为每个参与者创建一个断路器的当前方法违背了目的,因为为每个“请求”创建了一个新参与者,该“请求”对该外部资源执行一系列操作。
不理想 - CB 实例太多;
class MySharedResourceActor(externalResourceRef: ExtSystem) extends Actor with ActorLogging {
val breaker = new CircuitBreaker(context.system.scheduler,
maxFailures = 5,
callTimeout = 10.seconds,
resetTimeout = 1.minute).onOpen(notifyMeOnOpen())
def receive = {
case SomeExternalOp =>
breaker.withSyncCircuitBreaker(dangerousCallToExternalSystem()) pipeTo sender()
}
}
更好的方法 - 传递一个 CB ref;
class MySharedResourceActor(externalResourceRef: ExtSystem, val breaker: CircuitBreaker) extends Actor with ActorLogging {
def receive = {
case SomeExternalOp =>
breaker.withSyncCircuitBreaker(dangerousCallToExternalSystem()) pipeTo sender()
}
}
从父参与者传递断路器引用是否安全,该父参与者还维护对外部系统的引用并在路由器池中的多个参与者之间共享此断路器,动态创建或以其他方式创建?