2012-10-20 14 views
6

W moim serwerze websocket opracowanym z Erlang, chciałbym użyć timera (start_timer/3), dla każdego połączenia, aby zakończyć połączenie, jeśli upłynie limit czasu bez otrzymywania "ping" od klienta.Czy liczniki czasu Erlanga?

Czy timery Erlanga działają dobrze, zakładając, że będę miał dużą liczbę klientów na connestions?

Odpowiedz

8

Co to jest duża liczba połączeń? Maszyna Erlangs VM wykorzystuje wewnętrzne koło czasowe do obsługi timerów, dzięki czemu skaluje się dość dobrze do kilku tysięcy połączeń. Wtedy możesz wpaść w kłopoty.

Zazwyczaj chodzi o to, aby zgrupować pids razem na zegary. Właśnie to robią jądra. Jeśli na przykład masz zegar, który musi się obudzić w ciągu 200 ms, planujesz się przed czasem, a nie następnym razem, ale kolejny 200 ms ponownie. Oznacza to, że będziesz czekał co najmniej 200ms, a może 400ms, a 300ms będzie typowy. Dzięki przybliżeniu takich timerów można uruchomić o wiele więcej, ponieważ jeden zegar może jednorazowo obudzić dużą liczbę procesów. Ale w zależności od częstotliwości timera i ilości timerów może wystarczyć standardowy send_after/3.

W każdym razie, zacznę od założenia, że ​​może on skalować, a następnie obsłużyć problem, jeśli nie można tego zrobić, wykonując przybliżony czas, jak przewidziano powyżej.

0

Typowym wzorem dla tego rodzaju serwera jest wykorzystanie lekkich procesów Erlanga i utworzenie serwera na połączenie.

można zbudować na przykład serwer przy użyciu zachowań gen_server że zapewni Ci zarówno

  • różny stan zarządzać połączenia (oczekiwanie na połączenie, login, ...) ze zmienną państwa,
  • indywidualny limit czasu dla każdego połączenia i dla każdego stanu, zarządzany przez zachowanie maszyny wirtualnej i protokołu OTP.

Fajną rzeczą jest to, że każdy serwer musi dbać o jednego klienta, więc jest to naprawdę łatwiejsze do napisania.

Faza startowych należy uruchomić jeden serwer czeka na połączenia,

Następnie na połączenie serwer powinien uruchomić nowy jeden gotowy do następnego klienta (najlepiej poprzez opiekuna uruchomienie simple_one_for_one dziecka) i udać się zalogować krok czy cokolwiek chcę zrobić.

Znajdziesz tu bardzo ciekawe informacje na stronie LearnYouSomeErlang, w szczególności w rozdziale http://learnyousomeerlang.com/supervisors i następnych.