2012-11-02 11 views
8

Mam proces nadzoru, który rozpoczyna liczbę procesów podrzędnych. Obecnie, gdy umiera dziecko, uruchamiam nowy proces z nowym Pidem. Oznacza to, że tracę informację o stanie mojego procesu potomnego, który właśnie zmarł. Chcę, aby moi klienci komunikowali się z procesami potomnymi przy użyciu zawsze tego samego identyfikatora. Pomimo faktu, że proces potomny może umrzeć i zostać ponownie uruchomiony przez przełożonego.Ponowne uruchamianie procesu erlang i zachowanie stanu

Myślałem o rejestrowaniu procesów potomnych o unikalnych nazwach i przechowywaniu stanu dziecka w tabeli ets. Pytanie brzmi - jaki jest zalecany sposób podejścia do takiego problemu w Erlangu?

Dzięki!

Odpowiedz

8

Przechowywanie stanu procesu w tabeli ets będzie działało dla zachowania stanu pomiędzy awariami, a ja zwykle używam rejestru globalnego do nadawania nazwom trwałym procesów. (Gracz 200 zostanie zarejestrowany jako {player, 200}). Nie polecam korzystania z rejestru lokalnego, ponieważ wymaga on użycia atomów i jeśli masz wiele procesów potomnych, możesz szybko przeżyć limit atomów. tworzenie ich dynamicznie (jak player_200, player_201, itp.)

Przechowywanie stanu dziecka w tabeli ets ma jednak własne zagrożenia i problemy. Jeśli dziecko ulegnie awarii między momentem wystąpienia błędu a jego zapisaniem do tabeli ets, powinieneś być w porządku. Co jednak, jeśli przetwarzasz dane, które powodują, że dziecko zapisuje stan śmieci, a następnie przerywa przetwarzanie następnej wiadomości? Ponownie uruchomisz proces, załadujesz zły stan z tabeli ets i ponisz awarię następnej wiadomości. Są na pewno sposoby radzenia sobie z tym, ale powinieneś być świadomy, że jest to możliwe i obejść to.

Podczas gdy Erlang ukrywa problemy związane z dystrybucją tabeli ets do wszystkich procesów, dzieje się to kosztem procesora i potencjalnych błędów. Jeśli wprowadzasz wiele zmian w tabeli ets, zapłacisz za to w wydajności.

Jeśli twoje dzieci się załamują, czy nie powinieneś szukać sposobu na usunięcie błędnych warunków? Zwykle podejmowałbym awarię procesu jako coś, co musiałem wykorzenić przyczynę i naprawić. ?

+0

Największym problemem związanym z używaniem tabeli ets do przechowywania stanu procesów potomnych jest potencjalny szyjka butelki, którą mogę wprowadzić. Posiadanie wielu procesów często zmieniających stan wymaga od nich aktualizacji procesu, który posiada tabelę ets z nowym stanem za każdym razem, gdy następuje zmiana. Ilekroć dziecko umiera, muszę zrestartować go z tym samym stanem, który miał przed awarią. Gdy tylko proces potomny umrze, informuje przełożonego, wysyłając {'EXIT', Pid, ​​Reason}. Jeśli proces potomny mógłby również wysłać stan, który miał tuż przed awarią, mógłbym uruchomić ponownie w tym samym stanie i nie potrzebowałbym aktualizacji wysyłanych do tabeli ets. – Mark

+0

Nie sądzę, że jest to możliwe w Erlangu, ale ogólnie sądzę, że byłaby to fajna funkcja. Coś w rodzaju wysyłania stosu procesu do nadzorcy, gdy dziecko się zawiesza. – Mark

+0

@ Mark W artykule, który powołuję się w mojej odpowiedzi, wyjaśnia, w jaki sposób korzystać z gifting/dziedziczenia tabeli ETS w innym procesie, gdy proces posiadania zawiesi się, brzmi jak to, czego chcesz? – johlo

5

Używanie tabel ETS to prawdopodobnie sposób na zachowanie stanu. Vinoski's article omawia, jak umożliwić ponowne uruchomienie awarii z zachowaniem danych tabeli ETS.

As @ user30997 wskazuje, że dane w tabeli mogą być powodem, dla którego proces się zawiesił, więc po ponownym uruchomieniu możesz chcieć sprawdzić poprawność tabeli (lub ustawić limit, ile razy proces zostanie zrestartowany ...)

Aby powiązać procesy z identyfikatorami, należy spojrzeć na wersję gproc, która doskonale nadaje się do tego.

+0

+1 dla gproc - powinien być standardowym OTP – jtmoulia

0

Użyj zdarzeń, utrzymuj wszystkie zdarzenia i odtwarzaj ponownie, aby zrekonstruować stan. Jeśli potrzebujesz szybkich powtórek, zrób migawkę. Przykład poniżej: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-oslo

W rzeczywistości byłoby miło zbudować kompletny system oparty na tym przykładzie.

Powiązane problemy