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