Наблюдатель в распределенной среде - PullRequest
0 голосов
/ 10 сентября 2009

Машина A должна отправить сообщение на машину B. Машина A имеет статический IP-адрес, а машина B - нет.

Один из вариантов, который я мог бы решить для решения этой проблемы, заключается в том, что машина B открывает TCP-соединение с машиной A, а затем машина A отправляет данные / сообщения на машину B. Однако это решение имеет следующие ограничения:

a) Это не масштабируется, если существует много таких машин, как машина B, на которую / которые были отправлены данные. Это может быть уничтожение ресурсов машины A.

b) Это машина А, которая должна отправлять данные, когда она хочет. Машина B не знает , когда будут данные для него. В текущем варианте машина B должна будет постоянно опрашивать машину A с TCP-соединением, спрашивая, есть ли у него какие-либо данные для него или нет. Это может дорого обойтись, если есть много машин B.

Есть ли менее дорогой способ решить эту проблему? На ум приходит шаблон проектирования Observer. Машина B может подписаться на уведомление от машины A, чтобы сообщить ему, когда данные станут доступны. Однако как реализовать шаблон в распределенной среде, когда компьютер B не имеет статического IP-адреса?

Кроме наблюдателя, есть ли другой способ, кроме использования необработанных сокетов для машины A для отправки этих данных на машину B, который был бы дешевле?

Ответы [ 4 ]

1 голос
/ 10 сентября 2009

Посмотрите на IP Multicast , хотя вы можете обойтись и простой передачей UDP.

1 голос
/ 10 сентября 2009

Что делать, если устройство B делает вызов устройству A, чтобы зарегистрировать его IP-адрес для обновлений? Это был бы быстрый обмен сообщениями. Всякий раз, когда у машины A есть данные, она может создать новое соединение со всеми IP-адресами, которые зарегистрировали себя, и отправить им данные.

0 голосов
/ 11 сентября 2009

Я бы пошел с вашей первоначальной идеей, за исключением того, что нет необходимости опрашивать - B может просто поддерживать простое TCP-соединение с A в любое время, затем, когда A хочет отправить сообщение, он просто отправляет его всем клиенты, которые он подключил в то время. Перегрузка не будет проблемой - даже довольно старая машина может обрабатывать тысячи одновременных в основном простаивающих соединений TCP.

(Вы также захотите внедрить какие-то сообщения типа ответа эхо / эхо-сообщений keep-alive, если промежутки между реальными сообщениями превышают несколько минут, чтобы B мог быстро обнаружить потерянное соединение и восстановить соединение, а также избегайте информации об отслеживании подключений в брандмауэрах или маршрутизаторах на пути от тайм-аута.

0 голосов
/ 10 сентября 2009

Отсутствие статического IP-адреса означает, что он доступен извне, но его адрес меняется?

Если это так, то вы можете заставить аппарат B звонить A.detach(old_ip); A.attach(new_ip) каждый раз, когда меняется адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...