У меня такая ситуация.... Инициированная клиентом связь SOAP 1.1 между одним сервером и, скажем, десятками тысяч клиентов. Клиенты являются внешними, входящими через наш брандмауэр, аутентифицированными по сертификату, https и т. д. Они могут быть где угодно и обычно имеют свои собственные брандмауэры, маршрутизаторы NAT и т. д. Они действительно внешние, а не просто удаленные корпоративные офисы. Они могут быть в корпоративной/кампусной сети, DSL/кабельной, даже коммутируемой.
Клиент использует Delphi (2005 + исправления SOAP от 2007), а сервер - C #, но с точки зрения архитектуры/дизайна это не должно иметь значения.
В настоящее время клиенты передают новые данные на сервер и извлекают новые данные с сервера в течение 15-минутного цикла опроса. Сервер в настоящее время не отправляет данные — клиент использует метод «messagecount», чтобы увидеть, есть ли новые данные для извлечения. Если 0, он спит еще 15 минут и снова проверяет.
Мы пытаемся сократить это время до 7 секунд.
Если бы это было внутреннее приложение с одним или несколькими десятками клиентов, мы бы написали cilent-сервис мыла «слушателя» и передавали бы ему данные. Но поскольку они внешние, сидят за своими собственными брандмауэрами, а иногда и за частными сетями за маршрутизаторами NAT, это нецелесообразно.
Таким образом, у нас остается опрос на гораздо более быстром цикле. 10 000 клиентов, каждый из которых проверяет количество сообщений каждые 10 секунд, будут обрабатывать 1000 сообщений в секунду, которые в основном будут просто тратить ресурсы полосы пропускания, сервера, брандмауэра и аутентификатора.
Поэтому я пытаюсь разработать что-то лучшее, чем то, что можно было бы приравнять к DoS-атаке, которую я нанес сам себе.
Я не думаю, что сервер отправляет мыльные сообщения клиенту (push), так как это потребует слишком большой настройки на стороне клиента. Но я думаю, что есть альтернативы, о которых я не знаю. Такие как:
1) Есть ли способ для клиента сделать запрос на GetMessageCount() через Soap 1.1 и получить ответ, а затем, возможно, «оставаться на линии» в течение, возможно, 5-10 минут, чтобы получить дополнительные ответы в случае появления новых данных прибывает? то есть сервер говорит «0», а через минуту в ответ на какой-то триггер SQL (сервер C # на Sql Server, кстати), знает, что этот клиент все еще «на линии», и отправляет обновленное количество сообщений «5 "?
2) Есть ли какой-нибудь другой протокол, который мы могли бы использовать для «пингования» клиента, используя информацию, полученную из его последнего запроса GetMessageCount()?
3) даже не знаю. Думаю, я ищу какой-нибудь волшебный протокол, где клиент может отправить запрос GetMessageCount(), который будет включать информацию для «о, кстати, если ответ изменится в течение следующего часа, пропингуйте меня по этому адресу... ".
Кроме того, я предполагаю, что любая из этих схем «держать линию открытой» серьезно повлияет на размер сервера, поскольку потребуется одновременно поддерживать открытыми многие тысячи соединений. Я думаю, это, вероятно, повлияет и на брандмауэры.
Там есть что-то подобное? Или я в значительной степени застрял с опросом?
TIA,
Крис
ОБНОВЛЕНИЕ 30 апреля 2010 г.:
Продемонстрировав, что получение 7-секундных уведомлений не является ни простым, ни дешевым делом, особенно если не выходить за рамки корпоративного стандарта HTTPS/SOAP/брандмауэров, мы, вероятно, собираемся представить двухэтапное решение. На этапе 1 клиенты будут опрашиваться «по запросу», при этом GetMessageCount будет выполняться через SOAP, здесь нет ничего необычного. Будет кнопка «обновить» для извлечения новых данных (что здесь разумно, поскольку у пользователя обычно есть основания подозревать, что новые данные готовы, т. е. они только что изменили цвет ткани в онлайн-системе, поэтому они знают, что нужно нажать ОБНОВИТЕ перед просмотром ведомости доставки на рабочем столе, и теперь они видят цвет в описании.) (На самом деле это НЕ приложение для одежды/моды, но вы поняли идею). Идея постоянной синхронизации двух приложений с обновлениями в режиме реального времени, передаваемыми с хоста, по-прежнему актуальна с использованием обсуждаемых здесь технологий. Но я ожидаю, что это будет перенесено на другой выпуск, так как мы можем предоставить 85% функциональности без необходимости делать это. Тем не менее, я надеюсь, что мы проведем Proof Of Concept и сможем продемонстрировать, что это сработает. Я вернусь и опубликую будущие обновления. Спасибо всем за помощь в этом.