Mam aplikację, która reaguje na wiadomości wysyłane przez klientów. Jedna wiadomość to reload_credentials
, że aplikacja otrzymuje w momencie rejestracji nowego klienta. Ta wiadomość następnie połączy się z bazą danych PostgreSQL, wykona zapytanie dla wszystkich poświadczeń, a następnie zapisze je w zwykłym haśle Ruby (client_id => client_token).Jak powinienem obsługiwać ten przypadek użycia przy użyciu EventMachine?
Niektóre inne wiadomości, które może otrzymać aplikacja, to: start
, stop
, pause
, które służą do śledzenia niektórych czasów sesji. Chodzi mi o to, że ja sobie wyobrazić aplikacja działa w następujący sposób:
- klient wysyła wiadomość
- wiadomość zostanie kolejce
- kolejka jest przetwarzane
Jednakże, na przykład, don nie chce blokować reaktora. Ponadto, wyobraźmy sobie, że mam wiadomość reload_credentials
, która jest następna w kolejce. Nie chcę, aby jakiekolwiek inne wiadomości z kolejki były przetwarzane, dopóki referencje nie zostaną przeładowane z bazy danych. Ponadto podczas przetwarzania pewnej wiadomości (takiej jak oczekiwanie na zakończenie zapytania dotyczącego danych logowania) chcę zezwolić na kolejną wiadomość.
Czy mógłbyś poprowadzić mnie do rozwiązania tego problemu? Myślę, że będę musiał użyć em-synchrony
, ale nie jestem pewien.
Jednak wiadomość reload_credentials mogła zostać odebrana wiele razy. Czy nie powinno być 2 nitek? Jeden, który utrzymuje kolejkę i przetwarza? – Geo
Tak, jeśli reload_credentials zostanie odebrany podczas przetwarzania kolejnego reload_credentials, zostanie umieszczony w kolejce tak jak inne wiadomości. – simulacre
Wiele komunikatów reload_credentials powinno być traktowanych jak pierwsze. Umieszczając reload_credentials w bloku EM.defer, uruchamiasz go w innym wątku. Tak długo, jak kod "przetwarzania" nie będzie blokowany, będziesz otrzymywać wiadomości. Korzystaj z bibliotek kompatybilnych z EM, aby nie blokować. Alternatywnie można użyć EM.defer do przetwarzania. – simulacre