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