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