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