как узнать, изменился ли WAN IP, и получать массовые трансляции IP-адресов - PullRequest
3 голосов
/ 31 марта 2012

Система, которую я разрабатываю, потенциально имеет очень большое количество клиентов (скажем, миллион), которым необходимо периодически обновлять центральный сервер с некоторой информацией. Клиенты написаны на Java.

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

Решение, которое я имею в виду, требует, чтобы клиенты пропинговали сервер, чтобы обновить свой IP. Период в идеале должен быть один раз в минуту, но даже 1 пинг / 10 минут является приемлемым.

Мои вопросы, в последовательности:

  1. Пинг 1M в 1 мин. - более 10 К / сек. Итак, прежде всего я хочу знать подходы могут масштабироваться для обработки такой нагрузки. Это необходимо для ознакомления с доступными вариантами.

  2. Предполагая, что вы имеете в виду более одного решения, какое из этих будет самым экономичным? Критически важна экономическая эффективность. У меня нет собственного центра обработки данных или статическая и жирная конечная точка в сети, поэтому серверное приложение будет необходимо запустить на каком-либо провайдере или в конечном итоге в облаке.

Примечания:

  • Я подумал о том, чтобы запустить сервер из дома, используя свое собственное подключение, предоставленное провайдером, но я не уверен ни в проблемах с производительностью, ни в том, что мой провайдер подумает о постоянном потоке пингов.

  • Я не вижу, как сервер может автоматически обнаруживать эти изменения IP.

Ответы [ 6 ]

2 голосов
/ 22 апреля 2012

Эрик, ваша проблема намного проще, чем кажется, что она звучит.

Эта проблема существовала в течение десятилетия, может быть, два.Не нужно заново изобретать колесо.

Почему опрос / пинг - плохая идея

Динамические IP-адреса, предоставляемые интернет-провайдерами, могут иметь переменное время аренды, но часто оно составляет не менее 24-72 часаПинг вашего сервера каждые 1-10 м будет ужасной тратой ресурсов, потенциально совершающих более 4320 бесполезных HTTP-запросов на КЛИЕНТА в течение 72 часов.Каждый запрос будет содержать около 300 байт. * 4320 потраченных впустую HTTP-запросов равняется потере пропускной способности 1,3 Мбайт, умноженной на количество целевых клиентов, равное 1 миллиону клиентов.И это только потраченная впустую полоса пропускания, а не другая полоса пропускания, которая может понадобиться вам для запуска приложения и предоставления полезной информации.

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

То, что вы описываете, - это динамический DNS

То, о чем вы говорите, - это «Динамический DNS» (оба являются описательным названием длятехнология, а также название одной компании, которая предоставляет SaaS-решение.

Динамический DNS - это просто DNS-сервер, который позволяет очень быстро изменять сопоставление между именем и IP-адресом.Обычно это полезно для устройств, использующих интернет-провайдера, который предоставляет только динамические IP-адреса.Всякий раз, когда IP-адрес маршрутизатора / сервера изменяется на динамическом IP-адресе, он сообщает динамическому DNS-серверу об этом изменении.

  • Стандартный протокол defacto для динамического DNS хорошо документирован.Начните здесь: API обновления DNS , я думаю, что вы ищете здесь: DynDNS Perform Update .Большинство коммерческих реализаций очень близки к одному и тому же протоколу из-за того, что оборудование маршрутизатора обычно имеет встроенный клиент DynDNS, который каждый хочет использовать.
  • Большинство маршрутизаторов (даже дешевых) уже имеют клиенты Dynamic DNSвстроенный в них.(Вы можете написать свой собственный программный клиент, но маршрутизатор, вероятно, является наиболее эффективным местом для этого, поскольку ваши клиенты, вероятно, используют NAT с частным IP-адресом - вы все равно можете сделать это, но за счет большей пропускной способности для обнаружения общего IP-адреса)
  • Быстрый поиск в Google по запросу "динамический Java-клиент DNS" вызывает проекты с полным исходным кодом, такие как этот: Клиент Java DynDNS (непроверенный, просто иллюстрирующий всю мощь поиска)

Другие аспекты архитектуры вашей системы

Допустим, проблема сопоставления IP-клиента решена.Вы выяснили все это, и он отлично работает, вы всегда знаете IP для каждого клиента.Будет ли у вас хорошая надежная система для передачи файлов клиентам с мобильных устройств?Я бы сказал, что нет.

У мобильных и домашних компьютеров может быть несколько типов подключения: Wi-Fi, сотовая связь, возможно, проводная связь.Каждая из этих сетей может иметь разные системы безопасности.Таким образом, подключение мобильного сотового телефона к ноутбуку Wi-Fi за домашним маршрутизатором будет сильно отличаться от подключения мобильного устройства Wi-Fi к ноутбуку в той же сети Wi-Fi.

Возможно, у вас есть физические брандмауэры маршрутизатора для борьбыс.Также на домашних компьютерах может быть включен брандмауэр Windows, может быть, Norton Internet Security, может быть, Symantec, может быть AVG, может быть зональная сигнализация и т. Д. Знаете ли вы, что такое брандмауэр для всех этих потенциальных клиентов?

2 голосов
/ 19 апреля 2012

Может быть, вы могли бы использовать SIP в качестве протокола для этой цели? Вероятно, java SIP-библиотеки уже решили вашу проблему.

Кстати, хорошее приложение.

1 голос
/ 22 апреля 2012

Вы можете создать свой собственный протокол поверх UDP, например, на основе XML. Определить 3 сообщения:

  • запрос - клиент запрашивает вызов с сервера
  • вызов - сервер отвечает на запрос (в основном случайное число)
  • ответ - клиент отправляет имя пользователя и хэшированный пароль + вызов обратно на сервер

Это легкий и не слишком интенсивный трафик. Вы можете распределить нагрузку на несколько серверов на любом уровне или с помощью балансировщика нагрузки.

Любой средний ПК может обрабатывать миллион таких обращений в минуту, если вы выполняете серверную часть в C / C ++ (я не знаю о производительности сети Java)

1 голос
/ 21 апреля 2012

Я бы посоветовал лучше настроить Java-программу, чтобы узнать изменение IP-адреса, а затем использовать только веб-сервис.

Вы можете сделать это следующим образом:

  1. при инициализации вашей java-программы извлеките IP-адрес компьютера и сохраните его в глобальной переменной или, что лучше, в файле некоторых свойств.
  2. Выполнитьпакетный процесс / планировщик , который будет проверять ваш IP каждые 30 секунд / 1 минуту на предмет изменений. Java Quartz Scheduler очень пригодится вам.
  3. Вызов веб-службыв случае изменения IP-адреса.

Таким образом, уменьшается роль сервера и, следовательно, трафик и соединения.

0 голосов
/ 22 апреля 2012

У меня есть вариант использования правильно?Сообщество пользователей все хотят получать фотографии друг от друга?Вы не хотите размещать изображения на сервере, а транслировать их напрямую всем пользователям?

Здесь есть два вопроса.Первый вопрос: «Как узнать, изменился ли мой собственный IP-адрес в глобальной сети?»

Если у вас нет NAT, тогда:

InetAddress.getLocalHost()

сообщит вам ваш IP-адрес.

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

Второй вопрос - это что-то вроде «Как обмениваться изображениями между хостами, которые приходят и уходят в Интернете».

Возможное пространство решения включает в себя:

IP Multicast, возможно, с прямым исправлением ошибок и карусели, например, FLUTE.

File Swarming - например, bittorrent.

AРешение для публикации / подписки с использованием Jabber, AMQP, JMS, STOMP или аналогичных.Подходящие реализации включают в себя RabbitMQ, ActiveMQ и т. Д. Ключевыми концепциями здесь являются темы JMS.

Решение должно избегать огромных накладных расходов при выполнении действий на уровне IP.

0 голосов
/ 22 апреля 2012

Пожалуйста, посмотрите, как работает no-ip. Ваше требование точно такое же, как и то, что оно делает.

...