Акка-распределитель 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 они используют атоматику внутри автоматического выключателя для представления состояний и переходов состояния оператора, поэтому они должны быть безопасными для использования несколькими участниками.