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

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

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

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

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

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


person Daniel Rikowski    schedule 03.05.2009    source источник
comment
Убедило ли вас мое предложение?   -  person Ahmy    schedule 03.05.2009
comment
Нет, по сути, это то же самое, что я предложил в своем вопросе. Я все еще жду чего-то другого. Но лучшего решения у меня нет, я приму твой ответ :)   -  person Daniel Rikowski    schedule 03.05.2009


Ответы (4)


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

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

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

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

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

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

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

person joshng    schedule 03.05.2009

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

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

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

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

person Christian Lescuyer    schedule 03.05.2009

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

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

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

person Ahmy    schedule 03.05.2009

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

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

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

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

person Jeff Meatball Yang    schedule 31.05.2009