Co to jest spokojny sposób monitorowania zasobów odpoczynku pod kątem zmian?

Jeśli istnieje zasób REST, który chcę monitorować pod kątem zmian lub modyfikacji od innych klientów, jaki jest najlepszy (i najbardziej spokojny) sposób na to?

Pomysł, który miałem na to polega na dostarczeniu konkretnych zasobów, które utrzymają połączenie Otwarte, zamiast natychmiastowego powrotu, jeśli zasób nie istnieje (jeszcze). Na przykład, biorąc pod uwagę zasób:

/game/17/playerToMove

"GET" na tym zasobie może mi powiedzieć, że to moja kolej na ruch przeciwnika. Zamiast ciągle przepytując ten zasób, aby dowiedzieć się, kiedy nadejdzie moja kolej na ruch, mogę zanotować numer ruchu (powiedzmy 5) i spróbować pobrać następny ruch:

/game/17/move/5

W "normalnym" modelu REST, wydaje się, że żądanie GET dla tego adresu URL zwróci błąd 404 (not found). Jeśli jednak zamiast tego serwer utrzymał połączenie otwarte, dopóki mój przeciwnik nie zagra swojego ruchu, tzn.:

PUT /game/17/move/5

Wtedy serwer może zwrócić zawartość, którą mój przeciwnik umieścił w tym zasobie. To zarówno dostarczy mi Dane I potrzeba, a także rodzaj powiadomienia o tym, kiedy mój przeciwnik ruszył bez konieczności ankietowania.

Czy taki schemat jest spokojny? Czy to łamie jakąś zasadę odpoczynku?
Author: Community, 2009-01-02

3 answers

Twoje proponowane rozwiązanie brzmi jak długie sondaże , które mogą zadziałać naprawdę dobrze.

Poprosisz /game/17/move/5, a serwer nie wyśle żadnych danych, dopóki ruch 5 nie zostanie zakończony. Jeśli połączenie zostanie przerwane lub uzyskasz przerwę, po prostu połącz się ponownie, dopóki nie otrzymasz prawidłowej odpowiedzi.

Zaletą tego jest to, że jest to bardzo szybkie - gdy tylko serwer otrzyma nowe dane, klient je otrzyma. Jest również odporny na zerwane połączenia i działa, jeśli klient jest rozłączony na chwilę (możesz poprosić /game/17/move/5 godzinę po przeniesieniu i natychmiast pobrać dane, a następnie przejść na move/6/ i tak dalej)

Problem Z Długim ankietowaniem polega na tym, że każda "ankieta" wiąże wątek serwera, który szybko łamie serwery takie jak Apache (ponieważ kończy się wątek roboczy, więc nie może przyjmować innych żądań). Potrzebujesz wyspecjalizowanego serwera www, aby obsłużyć długie zapytania ankietowe.. Moduł Python twisted ("event-driven networking engine") jest do tego świetny, ale to więcej pracy niż zwykłe sondaże..

W odpowiedzi na twój komentarz o Jetty / Tomcat, nie mam żadnego doświadczenia z Javą, ale wygląda na to, że obaj używają podobnego systemu worker-threads do Apache, więc będzie miał ten sam problem. Znalazłem ten post {[6] } który wydaje się rozwiązywać dokładnie ten problem (dla Tomcat)

 24
Author: dbr,
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-05-23 12:34:23

Znalazłem Ten artykuł proponujący nowy nagłówek HTTP, "When-Modified-After", który zasadniczo robi to samo-serwer czeka i utrzymuje połączenie otwarte, dopóki zasób nie zostanie zmodyfikowany.

Wolę podejście oparte na wersji, a nie podejście oparte na znaczniku czasu, ponieważ jest mniej podatne na warunki wyścigowe i daje trochę więcej informacji o tym, co to jest pobieranie. Jakieś pomysły na to podejście?

 2
Author: Ross,
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
2009-01-02 03:43:17

Sugerowałbym 404, jeśli zamierzonym klientem jest przeglądarka internetowa, ponieważ utrzymywanie otwartego połączenia może aktywnie blokować żądania przeglądarki w kliencie do tej samej domeny. Od klienta zależy, jak często ankieta.

 2
Author: Tracker1,
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
2009-01-02 03:54:18