Реализация Comet на стороне базы данных

Это больше из любопытства и "для будущего использования", чем что-либо еще, но как Comet реализуется на стороне базы данных? Я знаю, что большинство реализаций используют долгоживущие HTTP-запросы, чтобы "подождать", пока данные не станут доступны, но как это сделать на стороне сервера? Как веб-сервер узнает о появлении новых данных? Он постоянно опрашивает базу данных?

2 ответа

Решение

Какую БД вы используете? Если он поддерживает триггеры, которые многие СУБД выполняют в той или иной форме или в той или иной форме, то вы могли бы вызвать триггер, запускающий событие, которое фактически указывает HTTP-запросу на отправку соответствующего ответа.

Триггеры устраняют необходимость опроса... опрос, как правило, не лучшая идея.

PostgreSQL, похоже, имеет довольно хорошую поддержку (даже PL/Python).

Это очень сильно зависит от приложения. Наиболее вероятная реализация - это своего рода система обмена сообщениями.

Скорее всего, ваш серверный код будет состоять из нескольких частей:

  • несколько серверов приложений, которые обрабатывают входящие запросы,
  • (отдельный) комет-сервер, который имеет дело со всеми открытыми соединениями с клиентами,
  • база данных, и
  • какая-то инфраструктура обмена сообщениями

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

Реализация обмена сообщениями, опять же, очень сильно зависит от приложения. Очень простая реализация будет использовать таблицу базы данных под названием messages и опросите это.

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

В Rails я использую Juggernaut, который просто слушает какой-то сетевой порт. Всякий раз, когда есть данные для отправки, сервер приложений Rails открывает соединение с этим push-сервером juggernaut и сообщает ему, что отправлять клиентам.

Другие вопросы по тегам