Двунаправленная связь JSON-RPC в режиме реального времени через HTTP

Я создаю сервер JSON-RPC, который принимает запросы по HTTP. Я хотел бы поддерживать двунаправленную связь (и клиент, и сервер могут отправлять запросы), конкретный вариант использования — это архитектура публикации/подписки, когда клиент отправляет subscribe(X) запрос и получает changed(X) запросы в (почти) режиме реального времени. Насколько я знаю, есть несколько способов реализовать это с помощью HTTP:

  • долгий опрос
  • Веб-сокеты
  • опрос вызовов с использованием модели сеанса на основе файлов cookie
  • потоковая передача (поддержание HTTP-соединения открытым)
  • сочетание некоторых из вышеперечисленных

Я ищу решение, основанное на общепринятых интернет-стандартах (если это возможно), которое можно использовать в веб-браузере и с которым легко работать на стороне клиента. Пока что я предпочитаю потоковую передачу (так делают Twitter, CouchDB), но я не уверен, насколько хорошо это поддерживается в браузерах и библиотеках JSON-RPC. Кроме того, могут быть и другие способы сделать это, о которых я не знаю.

Заранее спасибо.


person Felix Lange    schedule 27.01.2011    source источник


Ответы (4)


Я думаю, вам следует взглянуть на socket.io, чтобы выполнить свою задачу. Вы могли бы, если хотите, посмотреть это видео от автора: "Socket.IO Workshop : Гильермо Раух". С ним легко работать как на сервере, так и на клиенте. Я создал простой образец pubsub с помощью Redis поверх socket.io.

person Alfred    schedule 28.01.2011
comment
спасибо за ссылку на socket.io. мой компонент HTTP-сервера уже существует (в Erlang), но подход socket.io очень вдохновляет. - person Felix Lange; 29.01.2011

Насколько мне известно, потоковая передача поддерживается FF, Chrome (имеет проблемы с буферизацией, для работы которых требуется тип данных application/octet-stream или прелюдия) и IE8 (через небольшой XDomainRequest). Я не знаю об опере.

Я действительно не знаю каких-либо отраслевых стандартов для комет, Bayeux, вероятно, является ближайший. Трудно понять, как facebook/gmail/twitter делают это, поскольку весь код запутан, и чрезвычайно трудно найти много информации о том, как все браузеры обрабатывают все.

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

Это очень мощная конструкция, если вы можете заставить ее работать надежно.

person Andrew    schedule 28.01.2011
comment
Tornado утверждает, что может поддерживать тысячи параллельных подключений и используется в FriendFeed (теперь Facebook). Это также tornadoweb.org с открытым исходным кодом. - person keatch; 28.01.2011

Если кого-то интересует реализация Java, я только что написал пример приложения и сообщение в блоге о нем. Он использует Java, Maven, Comet, Bayeux, Spring. http://jaye.felipera.cloudbees.net/ http://geeks.aretotally.in/думая-в-обратном-не-получая-приказы-от-лет

person Felipe Oliveira    schedule 19.02.2011

Вам следует взглянуть на JSONRPC-bidirectional. Он поддерживает двунаправленный RPC через WebSocket, Worker, WebRTC. и HTTP, и он очень расширяемый.

person Darkov    schedule 16.06.2019