2011-03-15 5 views
31

Prowadzę stronę, na której użytkownicy mogą rozmawiać ze sobą przez przeglądarkę (pomyśl o czacie na Facebooku). Jaki jest najlepszy sposób na interakcję na żywo? (Teraz mam zamiar poll co 30 sekund, aby zaktualizować użytkowników online i nowe wiadomości przychodzące, a drugi sondaż dzieje na stronach czat co drugi, aby uzyskać nowe wiadomości.)Skalowanie aplikacji do czatu - krótka ankieta a dłuższa ankieta (AJAX, PHP)

Czego już za:

  • HTML5 Web Sockets: nie używałem tego, ponieważ nie działa we wszystkich przeglądarkach (tylko chrome).
  • Flash Sockets: nie używałem tego, ponieważ chciałem w końcu wesprzeć mobilną sieć.

W tej chwili używam krótkiego sondowania, ponieważ nie wiem, w jaki sposób można przeprowadzić długotrwały sondaż AJAX. Używam teraz serwera VPS z servint (uruchamianie apache). Czy powinienem używać długiego sondowania lub krótkiego sondowania? Nie potrzebuję absolutnie natychmiastowych odpowiedzi (tylko "wystarczająco dobre" na aplikację do czatu). Czy to jest krótka ankieta z kilkoma setkami tysięcy użytkowników, którzy zabiją mój serwer? Jak mogę to skalować, proszę o pomoc!

+1

Wiem, że Apache ogólnie nie radzi sobie dobrze z wieloma równoczesnymi połączeniami. A także zdaj sobie sprawę, że mogą istnieć inne rozwiązania stworzone dla tego scenerio (nodejs, itp.). Ale teraz chciałbym uniknąć przepisywania całej aplikacji. –

+0

Co z wdrażaniem wielu rozwiązań dla różnych platform? Np. Jeśli HTML5 jest obsługiwany, przeglądarka używa HTML5, jeśli flash jest obsługiwany, przeglądarka używa Flasha, jeśli żadna z powyższych nie jest obsługiwana, przeglądarka używa ajax. – binaryLV

+0

Możesz być zainteresowany tym postem http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/ –

Odpowiedz

41

Kilka uwag:

  • Polling każda sekunda jest przesadą. Aplikacja będzie nadal reagować bardzo szybko, z kilkoma sekundami opóźnienia między kontrolami.
  • Aby zapisać szybkość ruchu i szybkość reakcji db, rozważ użycie pamięci podręcznej w pamięci do przechowywania niedostarczonych wiadomości. Nadal można przechowywać wiadomości w bazie danych, pamięć podręczna w pamięci będzie po prostu używana do zapytań o nowe wiadomości, aby uniknąć zapytań do bazy danych co x sekund przez każdego użytkownika.
  • Limit czasu na czacie użytkownika po x sekundach bezczynności, aby zatrzymać odpytywanie na serwerze. Zapewnia to, że ktoś opuszczający otwarte okno nie będzie generował ruchu. Zaoferuj proste "Nadal tam?" Kontynuuj czat. " link do sesji, w których limit czasu i ostrzeżenie użytkownika przed upływem czasu, aby mogli przedłużyć limit czasu.
  • Proponuję zacząć od pollingu, a nie od komety/długiego sondowania/gniazd. Ankietowanie jest proste w budowie i wspieraniu, a prawdopodobnie będzie skalować się w niedługim czasie. Jeśli masz duży ruch, możesz przesłać sprzęt i mechanizm równoważenia obciążenia w celu skalowania. Cała sieć oparta jest na sondowaniu - sondowanie to z pewnością skale. Istnieje punkt, w którym złożoność alternatyw, takich jak kometa/długi głosowanie/itp. Ma sens, ale potrzebujesz dużego ruchu, zanim dodatkowy czas/złożoność projektu będzie uzasadniony.
+0

Twój Ostatni punkt był bardzo pomocny - starałem się zdecydować, w jaki sposób powinna być wdrożona pierwsza wersja ankietowa w mojej aplikacji, i myślę, że wezmę twoją radę i szybko rozpocznę prostą ankietę, a potem zaplanuję inteligentną rozwiązanie terminowe. – simmer

22

To jest coś, co wszyscy robili kiedyś przed wprowadzeniem cometd i nodejs.

Problem, jak widzę, to żądania PHP na Apache są bardzo drogie. Jeśli Twój czat sprawdza wiadomości co sekundę, znajdziesz się w sytuacji, w której Apache nie ma wystarczających zasobów, aby odpowiedzieć na prośby. Drugi obszar, który moim zdaniem wymaga poprawy, to poprawienie kontekstu aplikacji do czatu.

Dlaczego aktualizuje się co sekundę, jeśli nie ma nowych wiadomości? Co zrobić, jeśli nie ma żadnych wiadomości?

Niektóre techniki, których można użyć;

  • Podaj końcowy lekki do swoich klientów, że ma pewien kontekst o sesji czatu, to nowa wiadomość w toku, ile wiadomości itd. Klient może odpowiedzieć na to poprzez aktualizację natychmiast, czy też nie, czy istnieją brak nowych wiadomości. Ten punkt końcowy może dostarczyć prosty obiekt Json za pośrednictwem żądania http. Masz gwarancję, że ten komunikat o stanie będzie miał stały rozmiar, a jeśli odpowiedź nie zmieni się, możesz go zepsuć. Zobacz następną wiadomość.

  • Prosty zanik pollingu javascript, jeśli klient otrzymuje taką samą odpowiedź z serwera kilka razy z rzędu można zwiększyć ankietę o ustalony czas, obecnie powiedziałeś, że to co sekundę. Jeśli to zrobiłbyś, zwiększałbyś się do co 2,4,6,8,10 sekund. Jak tylko odpowiedź z serwera zmieni się, zresetujesz zanik.

Niektóre optymalizacje do rozważenia;

  • Użyj pamięci podręcznej PHP Opcode, np. APC.

  • Ustaw niski limit czasu we wszystkich żądaniach, nie chcesz żadnych żądań zawieszenia swojego serwera.

  • Zoptymalizuj swój kod PHP, spraw, by był on szybki i szybki.

  • Przeprowadź testy obciążenia, aby sprawdzić, jakie są ograniczenia.

  • Często sprawdzana wydajność, aby zapewnić szybsze działanie aplikacji.

  • Sprawdź dzienniki aplikacji Apache, aby uzyskać informacje o ogólnym stanie zdrowia aplikacji i czasie reakcji.

Gdy skalowanie staje się konieczne, dodaj nowy serwer i użyj modułu równoważenia obciążenia, aby rozdzielić żądania. Użyłem Varnish i HAProxy z wielkim sukcesem, ustawienie ich również nie jest skomplikowane.

+0

Dynamiczny przyrost to coś, o czym nigdy nie pomyślałam, naprawdę dobry punkt – JayIsTooCommon

1

Gdybym był, wybrałabym bibliotekę, która korzysta z gniazd internetowych html5, a jednak z powrotem na gniazdach flash, jeśli html5 nie jest dostępny, przeglądarka, która wchodzi w pęknięcie, powinna być minutą.

Powinieneś też zrezygnować z php lub uzupełnić go o serwer z gwintowanym gniazdem napisany w python lub rubin z em-websocket.