/ / Wszystkie wiadomości Akka zatrzymują się natychmiast - scala, akka

Wiadomości Akka zatrzymują się natychmiast - scala, akka

Mam ten śmieszny problem i nie jestem w stanie zidentyfikować problemu.

Mam tę "prostą" aplikację akka. Jego głównym celem jest przeglądanie każdego dokumentu w bazie danych Mój główny aktor żąda wierszy do jednego aktora, który komunikuje się z bazą danych, każdy pobrany dokument jest zwracany do mojego głównego aktora, a partiami, te dokumenty są dodawane do wiadomości kolejka zarządzana przez dyspozytora bilansującego, a drobni pracownicy przechodzą przez nie i sortują je.

Po kilku godzinach, zwykle pomiędzy 2 a 4, wszyscy aktorzy zatrzymują się w tym samym czasie, w odstępach co 5 sekund.

Zastanawiałem się, czy ktokolwiek z was widział coś podobnego.

Dla informacji:

  • Używam AkkA 2.2.0
  • Nie są używane komunikaty z pytaniami, tylko powiedz
  • Nie stosuję żadnych metod blokowania nici, takich jak Await
  • DeadLetters powodują, że wiem, że wszystko się kończy

Dziękuję za pomoc


Wydaje mi się, że od DeadLetters tylko aktorzy związani z moim routerem równoważącym / moim rundującym robakiem przestają działać. Czy będzie coś, co przeoczyłem?

Moja scala

val workers: ActorRef = context.system.actorOf(
Props(new WorkerActor)
.withRouter(FromConfig())
.withDispatcher("balancing-dispatcher"),
"round-robin"
)

Mój kod konfiguracji

balancing-dispatcher {
type = BalancingDispatcher
executor = "fork-join-executor"
}

akka.actor.deployment {
/round-robin {
router = round-robin
nr-of-instances = 50
resizer {
lower-bound = 10
upper-bound = 100
}
}
}

Odpowiedzi:

1 dla odpowiedzi № 1

Najpierw skorzystam z narzędzia do profilowania, takiego jakjconsole lub jvisualvm, aby sprawdzić problemy z pamięcią, GC i / lub fork + join. Czy masz wystarczająco dużo sterty? Zapisać także liczbę wątków i stany gwintów (czy wątki są rozwidlone lub połączone, gdy pojawia się spowolnienie?)

Możliwe, że musisz skonfigurować więcejwątki w puli wątku Akki lub że osiągnąłeś górny limit 100 instancji i że wszystkie są zajęte. Możesz podklasować implementację DefaultResizer, aby zapewnić jawne powiadamianie / rejestrowanie aktywności resizer i skonfigurować swoją podklasę jako resizer.