Akka Circuit Breaker между актерами

У меня есть общий внешний ресурс (скажем, хранилище файлов), который использует пул актеров. Каждый раз, когда в хранилище файлов делается новый запрос, создается новый субъект, чтобы заполнить запрос ссылкой на переданную внешнюю систему.

Текущий подход, в котором я создаю прерыватель цепи для каждого субъекта, отрицательно сказывается на цели, поскольку для каждого "запроса" создается новый субъект, который выполняет последовательность операций с этим внешним ресурсом.

Не идеально - слишком много экземпляров 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()
   }
} 

Better Approach - пройти в CB ref;

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам