Акка-распределитель Akka между актерами
У меня есть общий внешний ресурс (скажем, хранилище файлов), который использует пул актеров. Каждый раз, когда в хранилище файлов создается новый запрос, создается новый актер, чтобы заполнить запрос ссылкой на внешнюю переданную систему.
Текущий подход, когда я создаю автоматический выключатель для каждого участника, побеждает цель, поскольку новый актер создается для каждого "запроса", который выполняет последовательность операций над этим внешним ресурсом.
Не идеально - слишком много экземпляров 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 от родительского актера, который также поддерживает ссылку на внешнюю систему и передает этот автоматический выключатель между несколькими участниками в пуле маршрутизаторов, динамически созданным или иным образом?
Ответы
Ответ 1
Да, безопасно следовать этому подходу. Мы разделяем автоматические выключатели между связанными участниками (объединенными или другими), которые делают HTTP-вызовы одному и тому же хосту. Если вы этого не сделали, и пусть каждый экземпляр имеет свой собственный прерыватель, даже если они были долговечными экземплярами, каждый из них должен был бы поразить порог сбоя отдельно до того, как нарушитель откроется, и я сомневаюсь, что это поведение, которое вы хотите. Благодаря совместному использованию он позволяет нескольким участникам вносить вклад в статистику (неудачи, успехи) в прерыватель, чтобы прерыватель представлял все вызовы, которые вошли в ресурс.
При взгляде на код Akka они используют атоматику внутри автоматического выключателя для представления состояний и переходов состояния оператора, поэтому они должны быть безопасными для использования несколькими участниками.