Как решить регистрацию клиента в одноранговой сети?

Фон

Я хочу создать свою собственную одноранговую сеть с двумя одноранговыми узлами (должна быть индивидуальной). Я делаю это с помощью SocketIO, он отлично работает. Сначала я сделал это, используя архитектуру Клиент->Сервер, однако она не была идеальной для моих целей.

Текущая ситуация

Теперь я столкнулся с проблемой при создании одноранговой версии с двумя одноранговыми узлами. После того, как все клиенты подключены, они должны знать друг друга (ID+имя хоста). Для этого я придумал следующий план.

  1. Клиент подключается к Socket IO в группе (одновременно с некоторыми другими устройствами), добавляется в пул сеансов с другими связанными клиентами (с помощью промежуточного маршрутизатора NodeJS).

  2. Каждый новый клиент транслирует newClient сигнал.

  3. Каждый клиент транслирует данные ID+устройства другим при первоначальном присоединении.

Пока здесь все хорошо и работает.

  1. Всякий раз, когда клиент получает сигнал newClient, шаг 3 повторяется, поэтому, если устройства присоединяются к сеансу после того, как был создан первоначальный сеанс на шаге 1, новое устройство также получает данные клиента от существующих устройств.

Проблема

При наличии сеанса с n устройствами может быть выполнен шаг 3 amount раз (дляx > 2 и элемента N).

Для 100 клиентов шаг 3 выполнится 5153 раза, что довольно много.

Есть ли более разумный способ, чтобы данные устройства передавались реже, но при этом все подключенные устройства знали друг друга?


person Kevin Van Ryckegem    schedule 09.07.2017    source источник


Ответы (1)


Вы можете использовать структуру DHT (Distributed Hash Table), в которой идентифицируется каждый узел вашей сети. по ключу (детерминированный хэш на основе идентификатора вашего приложения + устройства), а узлы индексируются по их хэшу.

Одной из таких структур является аккорд, в котором организованы все узлы. в круговой структуре заданного максимального размера N = 2 ^ m с последующей функцией (S (n) = n + 1; S (2 ^ m) = 0). Позиция каждого узла в этом круге определяется его хешем. Каждый узел хранит список из m пальцев : список ближайших преемников на расстоянии 2^0, … 2^m от собственной позиции узла. Когда один узел входит в сеть, он соединяется с любой точкой входа в сети (по крайней мере, с одним известным узлом в сети), а затем находит своего первого преемника (за время O (N)), следуя за ближайшим узлом в таблице пальцев точки входа и так далее. на. Наконец, только соседние узлы обновляют свои таблицы finger.

В этом документе описывается алгоритм эффективного вещания в структурированных P2P-сетях, который использует хордовая структура.

Надеюсь это поможет.

person dral    schedule 14.07.2017