Mam udostępniony zasób zewnętrzny (powiedzmy magazyn plików), z którego korzysta pula aktorów. Za każdym razem, gdy nowe żądanie zostanie wysłane do magazynu plików, zostanie utworzony nowy aktor, aby wypełnić żądanie z odniesieniem do zewnętrznego systemu przekazanego.Dzielenie się wyłącznikami Akka między aktorami
Obecne podejście, w którym tworzę wyłącznik na jednego aktora, pokonuje cel jako nowy aktor jest tworzony dla każdego "żądania", które wykonuje sekwencję operacji na tym zewnętrznym zasobie.
Nie idealne - zbyt wiele instancji 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()
}
}
lepsze podejście - pass w odnośniku CB;
class MySharedResourceActor(externalResourceRef: ExtSystem, val breaker: CircuitBreaker) extends Actor with ActorLogging {
def receive = {
case SomeExternalOp =>
breaker.withSyncCircuitBreaker(dangerousCallToExternalSystem()) pipeTo sender()
}
}
Czy można bezpiecznie przejść w odniesieniu wyłącznik z aktorem macierzystego, który utrzymuje również odniesienie do systemu zewnętrznego i dzielić ten wyłącznik pomiędzy wieloma podmiotami w puli routera, tworzone dynamicznie lub w inny sposób?