Powiadomienie klienta, czy powinienem użyć Ajax Push lub Poll?

Pracuję nad prostą usługą powiadamiania, która będzie używana do dostarczania wiadomości do użytkowników surfujących po stronie internetowej. Powiadomienia nie muszą być wysyłane w czasie rzeczywistym, ale może to być lepsze doświadczenie użytkownika, jeśli zdarzały się częściej niż co 5 minut. Dane wysyłane do i od klienta nie są zbyt duże i jest to proste zapytanie do bazy danych, aby pobrać dane.

Czytając inne rozmowy na ten temat wydaje się, że Ajax push może spowodować większe obciążenie serwera. Ponieważ mogę tolerować dłuższe opóźnienia serwera, warto mieć powiadomienia push serwera lub po prostu ankietę.

Nie jest dużo trudniej wdrożyć scenariusz push, więc pomyślałem, że zobaczę, jaka jest tu opinia.

Dzięki za pomoc.

Edytuj: Zajrzałem do prostego Ajax Push i zaimplementowałem proste demo oparte na tym Artykuł Mike Purvis. Obciążenie klienta jest dość niskie w okolicach 5k dla początkowej wersji i oczekuje się, że pozostanie w ten sposób przez dłuższy czas.


Dziękuję wszystkim za odpowiedzi. Zdecydowałem się na rozwiązanie ankiety, ale owinąć to wszystko w bibliotekę narzędziową, aby jak chcą to później zmienić, było łatwiej.

Author: Robert Harvey, 2008-10-20

9 answers

Ponieważ używanie push wymaga utrzymywania otwartego połączenia HTTP między Twoim serwerem a każdym klientem, wybrałbym również ankietę - nie tylko pochłonie to wiele zasobów serwera, ale będzie również znacznie trudniejsze do wdrożenia, jak wspomniał matt B.

Moje doświadczenie z ankietami polega na tym, że jeśli masz wystarczająco częstą przerwę w ankietach na wystarczająco ruchliwej stronie, dzienniki serwera www mogą zostać bardzo szybko zalane żądaniami ankiet.

Edytuj (2017) : powiedziałbym, że Twoje wybory są teraz między websocketami a długimi sondażami(wspomnianymi w innej odpowiedzi). Wygląda na to, że długie ankiety mogą być właściwym wyborem w oparciu o sposób, w jaki pytanie wspomina, że powiadomienia nie muszą być odbierane w czasie rzeczywistym, Rzadki okres ankiety byłby dość łatwy do wdrożenia i nie powinien być zbyt obciążający na twoim serwerze. Websockets są fajne i świetny wybór dla wielu aplikacji w dzisiejszych czasach, brzmi jak to może być przesada w tym przypadku chociaż.

 5
Author: mmacaulay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 13:31:02

Dziwię się, że nikt tutaj nie wspomniał o długich sondażach. Długie sondowanie oznacza utrzymywanie otwartego połączenia przez dłuższy czas (powiedzmy 30-60 sekund), a gdy zostanie zamknięte, ponowne otwarcie go ponownie i po prostu posiadanie gniazda/połączenia nasłuchuje odpowiedzi. Powoduje to mniej połączeń (ale dłuższe) i oznacza, że odpowiedzi są niemal natychmiastowe (niektórzy mogą czekać na nowe połączenie ankietowe). Chciałbym dodać, że w połączeniu z technologiami takimi jak NodeJS skutkuje to bardzo wydajne i oszczędne rozwiązanie, które jest w 100% kompatybilne ze wszystkimi głównymi przeglądarkami i wersjami i nie wymaga żadnych dodatkowych technologii, takich jak Comet lub Flash.

Zdaję sobie sprawę, że to stare pytanie, ale pomyślałem, że przydałoby się jeszcze podać tę informację :)

 13
Author: Oddman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 05:25:15

Zdecydowanie używaj push its znacznie cooler. Jeśli potrzebujesz tylko prostych powiadomień, użyłbym czegoś takiego jak StreamHub Push Server , aby wykonać dla ciebie ciężkie zadanie. Rozwijanie własnej funkcjonalności Ajax Push jest niezwykle trudną i kamienistą drogą - musisz ją uruchomić we wszystkich przeglądarkach, a następnie obsługiwać firewalle i proxy, zabijając połączenia keep-alive itp... Po co wymyślać koło. Ma również podobnie niską powierzchnię mniejszą niż 10K, więc powinien pasować, jeśli jest to priorytet dla Ciebie.

 10
Author: Supertux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-15 23:05:41

Oba mają różne wymagania i odnoszą się do różnych scenariuszy.

Jeśli potrzebujesz aktualizacji w czasie rzeczywistym, Jak na czacie online, push jest koniecznością.

Ale jeśli okres odświeżania jest duży , Jak to jest w Twoim przypadku (5 minut), to pool jest odpowiednim rozwiązaniem. Push, w tym przypadku, będzie wymagał dużo zasobów zarówno od klienta, jak i serwera.

Tip! spróbuj zrobić stronę, która sprawdza basen szybko i czysto, aby nie zużywał dużo zasoby na serwerze w każdym żądaniu. Zwykle robię to, aby zachować flagę w pamięci (jak w zmiennej sesji), która mówi, czy pula jest pusta, czy nie... więc, mam tylko patrzeć w basenie tylko wtedy, gdy nie jest pusty. Gdy pula jest pusta, co jest przez większość czasu, żądanie strony działa bardzo szybko.

 7
Author: Daniel Silveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 02:15:18

Zaimplementowałbym ankietę tylko dlatego, że brzmi ona prościej, a utrzymywanie jej w prostocie jest bardzo cenne.

 3
Author: matt b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 20:53:24

Nie wiem, czy przyjrzałeś się niektórym implementacjom COMET (to masz na myśli przez Ajax push).

Jeśli użytkownik surfuje po stronie, to czy w rzeczywistości nie będzie to prośba o informacje z serwera, na które to powiadomienie może się zwrócić?

 1
Author: Lou Franco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 20:57:21

Nie można powiedzieć, czy sondaż będzie droższy niż forsowanie, nie wiedząc, ilu klientów będziesz miał. Polecam ankietę Bo:

    Wygląda na to, że chcesz aktualizować dane raz na minutę. O ile powiadomienia nie są w stanie dotrzeć w znacznie szybszym tempie, naciskanie oznaczałoby, że utrzymujesz połączenie HTTP otwarte, ale widzisz bardzo małą aktywność na nim.
  • ankieta jest zbudowana na bazie istniejących konwencji HTTP, więc każdy serwer, który mówi do przeglądarek internetowych jest już gotowy do odpowiedzi na zwykłe żądania Ajax. Rozwiązanie oparte na komecie lub gnieździe Flash ma różne wymagania; będziesz potrzebował czegoś w rodzaju cometd po stronie serwera i biblioteki po stronie klienta, która groks po stronie serwera push.
Więc jeśli potrzebujesz czegoś ciężkiego do zarządzania torrentem danych i craploadem klientów, polecam Comet. Ale tak nie wygląda.
 1
Author: savetheclocktower,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 21:45:13
 1
Author: Kirill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 20:52:14

Sam nie próbowałem, ale niektórzy twierdzą, że kometa działa i jest łatwiejsza niż myślisz . Jest też wtyczka Ruby on Rails o nazwie Juggernaut , o której słyszałem bardzo dużo. Ponownie, nie użyłem go, więc YMMV, ale rozumiem, że wymaga znacznie mniej zasobów w porównaniu do sondażu. Wierzę (może ktoś potwierdzić?/ align = "left" / MacRumorsLive.com dostarcza blogowanie na żywo WWDC Stevenotes.

 1
Author: Andrew Hedges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 17:11:22