Реализация Comet на стороне базы данных
Это больше из любопытства и "для будущего использования", чем что-либо еще, но как Comet реализуется на стороне базы данных? Я знаю, что большинство реализаций используют долгоживущие HTTP-запросы, чтобы "подождать", пока данные не станут доступны, но как это сделать на стороне сервера? Как веб-сервер узнает о появлении новых данных? Он постоянно опрашивает базу данных?
2 ответа
Какую БД вы используете? Если он поддерживает триггеры, которые многие СУБД выполняют в той или иной форме или в той или иной форме, то вы могли бы вызвать триггер, запускающий событие, которое фактически указывает HTTP-запросу на отправку соответствующего ответа.
Триггеры устраняют необходимость опроса... опрос, как правило, не лучшая идея.
PostgreSQL, похоже, имеет довольно хорошую поддержку (даже PL/Python).
Это очень сильно зависит от приложения. Наиболее вероятная реализация - это своего рода система обмена сообщениями.
Скорее всего, ваш серверный код будет состоять из нескольких частей:
- несколько серверов приложений, которые обрабатывают входящие запросы,
- (отдельный) комет-сервер, который имеет дело со всеми открытыми соединениями с клиентами,
- база данных, и
- какая-то инфраструктура обмена сообщениями
последнее, инфраструктура обмена сообщениями - действительно ключ. Это позволяет серверам приложений общаться с кометным сервером. Поэтому, когда на сервер приложений поступает запрос, он помещает сообщение в очередь сообщений, сообщая серверу комет об уведомлении правильных клиентов.
Реализация обмена сообщениями, опять же, очень сильно зависит от приложения. Очень простая реализация будет использовать таблицу базы данных под названием messages
и опросите это.
Но в зависимости от стека, который вы планируете использовать, должно быть доступно больше сложных инструментов.
В Rails я использую Juggernaut, который просто слушает какой-то сетевой порт. Всякий раз, когда есть данные для отправки, сервер приложений Rails открывает соединение с этим push-сервером juggernaut и сообщает ему, что отправлять клиентам.