Как лучше всего уведомить не веб-приложение об изменении веб-страницы? - PullRequest
4 голосов
/ 03 мая 2009

Допустим, у меня есть два приложения, которые в определенной степени должны работать вместе.

  1. Веб-приложение (PHP, Ruby on Rails, ...)
  2. Настольное приложение (Java, C ++, ...)

Настольное приложение должно получать уведомления от веб-приложения, и задержка между отправкой и получением уведомления должна быть короткой. (<10 секунд) </p>

Каковы возможные способы сделать это? Я могу думать о опросе с 10-секундным интервалом, но это привело бы к большому трафику, если многие настольные приложения должны быть уведомлены. В локальной сети я бы использовал широковещательную рассылку UDP, но, к сожалению, здесь это невозможно ...

Я ценю любые идеи, которые вы могли бы дать мне.

Ответы [ 4 ]

3 голосов
/ 03 мая 2009

Я вижу два пути:

  • Ваше настольное приложение опрашивает веб-приложение
  • Ваше веб-приложение уведомляет настольное приложение

Ваше веб-приложение может публиковать RSS-канал, но вашему настольному приложению все равно придется опрашивать канал каждые 10 с.

Трафик не должен быть огромным: если вы используете HTTP HEAD запрос, вы получите небольшой пакет с датой последней модификации (удобно именуемый Last-Modified ).

3 голосов
/ 04 мая 2009

Я думаю, что «лучшая практика» здесь будет зависеть от количества настольных клиентов, которых вы ожидаете обслуживать. Если нужно уведомить только один рабочий стол, тогда опрос вполне может быть хорошим подходом - да, опрос намного сложнее, чем уведомление на основе событий, но это, безусловно, будет самое простое решение для реализации.

Если затраты на опрос действительно неприемлемы, тогда я вижу две основные альтернативы:

  1. Сохранять постоянное соединение открытым между рабочим столом и веб-сервером (это может быть веб-запрос в стиле «кометы» или необработанное сокетное соединение)
  2. Предоставьте сервис из настольного приложения и зарегистрируйте адрес сервиса на веб-сервере. Таким образом, веб-сервер может вызывать рабочий стол по мере необходимости.

Но будьте осторожны - обе альтернативы переполнены гочами. Несколько основных моментов:

  • Поддержание открытого соединения может быть непростым делом, так как вы хотите, чтобы ваши веб-серверы были с возможностью горячей замены
  • Вызов внешнего веб-сервера (например, рабочего стола) с веб-сервера опасен, поскольку этот запрос может зависнуть. Вы бы хотели переместить это уведомление в отдельный поток, чтобы не связывать веб-сервер.

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

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

1 голос
/ 31 мая 2009

Уровень синдикации поможет масштабировать систему.

Настольное приложение может зарегистрироваться в службе «издатель» (запущенной на одном из нескольких / многих компьютеров). Эта служба издателя получает «уведомление» от вашего веб-приложения о том, что что-то изменилось, и немедленно начинает уведомлять все свои зарегистрированные абонентов.

Количество нужных вам издателей будет увеличиваться с увеличением количества пользователей.

Редактировать: Забыл упомянуть, что настольное приложение должно будет прослушивать сокет.

1 голос
/ 03 мая 2009

Я не знаю точно, что нужно сделать для достижения вашей задачи, но я могу предложить создать службу Windows на ПК с настольным приложением.

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

Я надеюсь, что это может быть полезно. Я не пробовал это точно, но я предлагаю использовать эту идею.

...