Совместное использование автоматического выключателя Akka между участниками

#scala #akka #actor #circuit-breaker

#scala #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;

 class MySharedResourceActor(externalResourceRef: ExtSystem, val breaker: CircuitBreaker) extends Actor with ActorLogging {
   def receive = {
      case SomeExternalOp =>
          breaker.withSyncCircuitBreaker(dangerousCallToExternalSystem()) pipeTo sender()
   }
} 
  

Безопасно ли передавать ссылку на автоматический выключатель от родительского участника, который также поддерживает ссылку на внешнюю систему, и совместно использовать этот автоматический выключатель между несколькими участниками в пуле маршрутизаторов, динамически создаваемом или иным образом?

Ответ №1:

Да, этот подход безопасен. Мы разделяем автоматические выключатели между связанными участниками (объединенными или иными), которые выполняют http-вызовы на один и тот же хост. Если вы этого не сделали и позволили каждому экземпляру иметь свой собственный прерыватель, даже если они были долгоживущими экземплярами, каждому из них нужно было бы достичь порога сбоя отдельно до открытия прерывателя, и я сомневаюсь, что это то поведение, которое вы хотите. Совместное использование позволяет нескольким участникам вносить статистику (сбои, успехи) в прерыватель, чтобы прерыватель представлял все вызовы, которые поступили в ресурс.

При рассмотрении кода Akka они используют атомарные элементы внутри автоматического выключателя для представления состояния и обработки переходов состояний, поэтому они должны быть безопасными для использования несколькими участниками.