Как показать непрерывные обновления в реальном времени в браузере, например, facebook ticker, домашняя страница meetup.com? В python, PHP, node.js и каково влияние производительности на стороне сервера? Также как мы можем достичь того же самого обновления, если страница кэшируется CDN, например, akamai?
У вас есть два варианта (другие подробно описаны выше). В случае, если вы не знакомы с некоторыми концептуальными идеями, стоящими за каждым вариантом, я решил, что я расскажу им пару строк. Обратите внимание, что я представляю эти концепции на очень, очень высоком уровне.
Ваши три варианта:
Короткие опросы преодолевают одностороннюю связь между Client-Server, заставляя клиента непрерывно отправлять запросы серверу формы:
Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: Yes. Here it is! Client: Yay! Client: (update message)
Постоянное ворчание от имени Клиента называется опросом . Чтобы реализовать эту структуру, вам нужно настроить сервер для «прослушивания» этих запросов опроса от клиента. Сервер также должен будет хранить эти сообщения где-нибудь, так что когда сообщения будут готовы, сервер может их доставить. На очень высоком упрощенном уровне вашему серверу необходимо:
Вам также потребуется связать эти запросы опроса с каким-либо идентификатором сеанса для пользователя, чтобы правильные сообщения дошли до нужного человека. В целом парадигма сложна и, на мой взгляд, неэффективна.
Веб-сокеты являются новыми для HTML5. Основная идея заключается в том, что Клиент может поддерживать прямое подключение к серверу, и они могут передавать информацию друг другу взад и вперед. Поэтому вместо обычного: клиенты отправляют запрос GET >> Сервер отвечает содержимым, веб-сокеты позволяют поддерживать непрерывный диалог.
Однако, чтобы установить это, вам необходимо:
Настройка несколько сложна, хотя и проще, чем длительный опрос:
Вы увидите этот шаблон, называемый Push Notifications (конечно, если у вас есть iPhone, который вы испытали на этом), поскольку Сервер был уполномочен подталкивать «материал» клиенту (как невежливо!). Поскольку существует множество нюансов клиентов и серверов, я бы рекомендовал протестировать что-то вроде Pusher , которое в основном представляет собой веб-сервис для обработки всех жестких частей веб-сокетов. Это будет простой способ проверить и поиграть с шаблоном, прежде чем приступать к настройке самостоятельно. Он имеет как клиентские, так и серверные библиотеки.
Надейтесь, что эта информация дает вам базовый уровень для решения вашей проблемы. В других ответах есть более прямая информация о том, как решить каждый сценарий.
Альтернативным, казалось бы, кросс-браузерным подходом к веб-сокетам является Long-Polling (см. Comet ). В этом случае ваш клиент устанавливает соединение с сервером и оставляет его висящим, ожидая возврата данных. Настройка для этого несколько сложна, но она представляет собой среднюю площадку между коротким опросом и веб-сокетами .
Я бы предложил реализовать сокет, например, соединение с помощью SockJS или Socket.io в качестве библиотеки JavaScript на стороне клиента, а затем использовать Tornado на стороне сервера для публикации изменений состояния клиенту. Код довольно прост.
Клиентский код зависит от выбранной вами библиотеки. SockJS или SocketIO. Или, если вы просто хотите напрямую использовать Websockets, это очень просто:
update_socket = new WebSocket("ws://my_server.com/listening_url"); update_socket.onmessage = function (evt) { $("#my_div").html(evt); };
Код на стороне сервера также довольно прост:
import tornado class UpdateHandler(tornado.websocket.WebSocketHandler): def open(self): self.write_message('Hi client') # listen for some events that are occurring for message in function_that_generates_events(): self.write(message) def on_message(self, message): # Do something with incoming messages def on_close(self): # tidy up app = tornado.web.Application(('r/listening_url',UpdateHandler)) app.listen(9000)
Вы можете использовать опрос, длительный опрос или если вы хотите систему push. Самый простой был бы опрос. Однако для всех решений требуется кодирование на стороне клиента.
Эффективность зависит от вашего решения. Проще всего реализовать опрос. Опрос с короткой частотой действительно выполняет запрос каждый, скажем, 100 мс, имитируя в реальном времени. Долгосрочный опрос будет иметь меньшее влияние, но в течение более или менее времени он будет откладывать много запросов.
пристань
Двигатель Ajax Push
Socket.io
Это способы реализации кометы
Я бы порекомендовал Socket.io, который реализован с помощью Node.js
потому что он использует наилучший доступный метод подключения