2014-06-18 15 views
12

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?

Odpowiedz

9

Tak bezpiecznie jest stosować to podejście. Dzielimy się wyłącznikami na podobne podmioty (połączone lub inne), które wykonują połączenia http do tego samego hosta. Jeśli tego nie zrobiłeś i pozwoliłeś, aby każda instancja posiadała własny wyłącznik, nawet jeśli były to instancje o długiej żywotności, każda z nich musiałaby osobno przekroczyć próg błędu, zanim otworzy się otwieracz i wątpię, aby takie zachowanie było pożądane. Dzieląc się, pozwala wielu podmiotom wnosić statystyki (niepowodzenia, sukcesy) do łamacza, tak aby łamacz był reprezentatywny dla wszystkich połączeń, które przeszły do ​​zasobu.

Przyglądając się kodowi Akki, używają atomów wewnątrz wyłącznika do reprezentowania stanu i obsługi przejść między stanami, więc powinny być bezpieczne dla wielu podmiotów.

Powiązane problemy