Какой лучший способ для клиентского приложения немедленно отреагировать на обновление в базе данных? - PullRequest
10 голосов
/ 25 февраля 2009

Каков наилучший способ запрограммировать немедленную реакцию на обновление данных в базе данных?

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

Я полагаю, что должен быть какой-то способ, в конце концов, веб-приложение, такое как gmail, похоже, может обновить мой почтовый ящик почти сразу после того, как мне отправили новое письмо. Конечно, мой клиент не постоянно проверяет наличие обновлений. Я думаю, что они делают это с AJAX, но как AJAX может вести себя как удаленный вызов функции, я не знаю. Мне было бы интересно узнать, как это делает gmail, но больше всего мне хотелось бы знать, как это сделать в общем случае с базой данных.

Edit: Обратите внимание, что я хочу немедленно отреагировать на обновление в коде клиента, а не в самой базе данных, поэтому, насколько я знаю, триггеры не могут этого сделать. Обычно я хочу, чтобы ПОЛЬЗОВАТЕЛЬ получал уведомление или обновлял свой экран после внесения изменений в базу данных.

Ответы [ 4 ]

7 голосов
/ 26 февраля 2009

У вас есть две проблемы:

  1. Вы хотите, чтобы браузер мог получать асинхронные события от сервера веб-приложений без опроса в замкнутом цикле.

  2. Вы хотите, чтобы веб-приложение могло получать асинхронные события из базы данных без опроса в замкнутом цикле.

Для задачи № 1

Посмотрите эти ссылки на Википедию, чтобы узнать о типах техник, которые, я думаю, вы ищете:

РЕДАКТИРОВАТЬ: 19 марта 2009 г. - только что натолкнулся на ReverseHTTP , который может представлять интерес для задачи № 1.

Для задачи № 2

Решение будет зависеть от конкретной базы данных, которую вы используете, и, вероятно, от драйвера базы данных, используемого вашим сервером. Например, с PostgreSQL вы бы использовали LISTEN и NOTIFY . (И рискуя быть лишенным права голоса, вы, вероятно, будете использовать триггеры базы данных для вызова команды NOTIFY при изменениях данных таблицы.)

Другой возможный способ сделать это, если база данных имеет интерфейс для создания хранимых процедур или триггеров, которые ссылаются на динамическую библиотеку (то есть файл DLL или .so). Тогда вы могли бы написать сигнальный код сервера в C или в любом другом виде .

В одной и той же теме некоторые базы данных позволяют писать хранимые процедуры на таких языках, как Java, Ruby , Python и , другие . Вы можете использовать один из них (вместо того, что компилируется в DLL машинного кода, как это делает C) для механизма сигнализации.

Надеюсь, это даст вам достаточно идей, чтобы начать.

6 голосов
/ 25 февраля 2009

Я полагаю, что после того, как все, веб-приложение вроде gmail кажется обновить мой почтовый ящик почти сразу после того, как новое письмо было отправлено мне. Конечно, мой клиент не постоянно проверять наличие обновлений все время. я думаю, что они делают это с AJAX, но как AJAX может вести себя как вызов удаленной функции я не знаю. Я бы интересно узнать, как работает Gmail это, но то, что я больше всего хотел бы знать как это сделать в общем случае с базой данных.

Посмотрите иногда на wireshark ... там довольно часто появляется какой-то гугл-трафик.

В зависимости от вашей БД триггеры могут помочь. Приложение, которое я написал, использует триггеры, но я использую механизм опроса, чтобы «узнать», что что-то изменилось. Если вы не можете сообщить об изменениях из БД, я бы сказал, что нужен какой-то механизм опроса.

Только мои два цента.

1 голос
/ 25 февраля 2009

К сожалению, нет способа отправить данные в веб-браузер - вы можете отправлять данные только в ответ на запрос - так работает HTTP.

AJAX - это то, что вы хотите использовать, хотя: вызов веб-службы раз в секунду не является чрезмерным, если вы разрабатываете веб-службу так, чтобы она принимала небольшой объем данных, отправляла небольшой объем назад и могла работать очень быстро. быстро генерировать этот ответ.

1 голос
/ 25 февраля 2009

Ну, лучший путь - это база данных триггер . Зависит от способности вашей СУБД, которую вы не указали, поддерживать их.

Повторное редактирование: приложения, такие как Gmail, делают это с помощью опроса AJAX. Установите расширение Tamper Data Firefox, чтобы увидеть его в действии. Хитрость заключается в том, чтобы держать ваш опросный запрос ослепительно быстро в случае отсутствия новостей.

...