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