Подтвердить что ты не робот

Что такое RESTful способ мониторинга ресурса REST для изменений?

Если есть ресурс REST, который я хочу отслеживать для изменений или модификаций от других клиентов, каков наилучший способ (и самый RESTful) для этого?

Одна из моих идей для этого - предоставить определенные ресурсы, которые будут поддерживать соединение открытым, а не немедленно возвращаться, если ресурс пока не существует. Например, учитывая ресурс:

/game/17/playerToMove

a "GET" на этом ресурсе может сказать мне, что мой противник переключается. Вместо того, чтобы постоянно опробовать этот ресурс, чтобы узнать, когда он повернется, я могу отметить номер перемещения (скажем, 5) и попытаться извлечь следующий ход:

/game/17/move/5

В "нормальной" модели REST кажется, что запрос GET для этого URL-адреса будет возвращать ошибку 404 (не найден). Однако, если вместо этого сервер поддерживал соединение открытым, пока мой оппонент не сыграл свой ход, то есть:

PUT /game/17/move/5

тогда сервер может вернуть содержимое, которое мой оппонент выставляет на этот ресурс. Это обеспечило бы мне нужные мне данные, а также своеобразное уведомление о том, когда мой оппонент переехал, не требуя опроса.

Является ли такая схема RESTful? Или это нарушает какой-то принцип REST?

4b9b3361

Ответ 1

Ваше предлагаемое решение похоже на длительный опрос, который может работать очень хорошо.

Вы запросите /game/17/move/5, и сервер не будет отправлять какие-либо данные, пока не будет завершен шаг 5. Если соединение падает или вы получаете тайм-аут, вы просто подключаетесь, пока не получите правильный ответ.

Преимущество этого в том, что это очень быстро - как только у сервера появятся новые данные, клиент получит его. Он также устойчив к сбросам соединений и работает, если клиент некоторое время отключается (вы можете запросить /game/17/move/5 через час после его перемещения и мгновенно получить данные, затем перейти на move/6/ и т.д.)

Проблема с длинным опросом - это каждый опрос, связанный с потоком сервера, который быстро разрушает такие серверы, как Apache (поскольку он заканчивается рабочими потоками, поэтому не может принимать другие запросы). Вам нужен специализированный веб-сервер для обслуживания запросов на длительный опрос. Модуль Python twisted ( "управляемая событиями сеть" двигатель ") отлично подходит для этого, но он больше работает, чем обычный опрос..

В ответ на ваш комментарий о Jetty/Tomcat у меня нет опыта работы с Java, но похоже, что оба они используют подобную систему потоков-работников для Apache, поэтому у нее будет такая же проблема. Я нашел этот пост, который, как представляется, касается именно этой проблемы (для Tomcat)

Ответ 2

Я нашел в этой статье, предлагая новый HTTP-заголовок "When-Modified-After", который по сути делает то же самое - сервер ждет и держит соединение открытым до тех пор, пока ресурс не будет изменен.

Я предпочитаю подход на основе версии, а не подход, основанный на отметке времени, поскольку он менее подвержен условиям гонки и дает вам немного больше информации о том, что именно вы извлекаете. Любые мысли этого подхода?

Ответ 3

Я бы предложил 404, если ваш предполагаемый клиент является веб-браузером, поскольку сохранение открытого соединения может активно блокировать запросы браузера в клиенте в том же домене. Это зависит от клиента, как часто опросить.