У меня есть общий внешний ресурс (скажем, хранилище файлов), который использует пул актеров. Каждый раз, когда в хранилище файлов создается новый запрос, создается новый актер, чтобы заполнить запрос ссылкой на внешнюю переданную систему.
Текущий подход, когда я создаю автоматический выключатель для каждого участника, побеждает цель, поскольку новый актер создается для каждого "запроса", который выполняет последовательность операций над этим внешним ресурсом.
Не идеально - слишком много экземпляров 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()
}
}
Безопасно ли передавать ссылку на Circuit-breaker от родительского актера, который также поддерживает ссылку на внешнюю систему и передает этот автоматический выключатель между несколькими участниками в пуле маршрутизаторов, динамически созданным или иным образом?