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

StackOverflow https://stackoverflow.com/questions/405950

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

/game/17/playerToMove

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

/game/17/move/5

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

PUT /game/17/move/5

тогда сервер сможет вернуть содержимое, которое мой оппонент ПОМЕЩИЛ в этот ресурс.Это предоставит мне необходимые данные, а также своего рода уведомление о том, когда мой оппонент сделал ход, без необходимости опроса.

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top