Как отправить данные на несколько хостов, используя потоки golang libp2p?

#go #stream #peer #libp2p

#Вперед #поток #peer #libp2p

Вопрос:

мой вопрос относится к библиотеке libp2p в golang: https://github.com/libp2p/go-libp2p

Это видео объясняет предысторию: https://www.youtube.com/watch?v=hP0hSZ7E7_Y

Одноранговые узлы в сети обмениваются данными через буферизованные потоки rw . Для каждого нового подключающегося узла создается новый поток, который соединяет его с существующим узлом, используя адреса. Это означает, что существует несколько потоков, но не все одноранговые узлы напрямую связаны друг с другом. Используя эти потоки, одноранговые узлы могут считывать и записывать данные из него через

rw := bufio.NewReadWriter(bufio.NewReader(stream),bufio.NewWriter(stream))

путем записи сообщений «rw.WriteString(«message») , rw.Flush()`

и чтение этих сообщений через message := rw.ReadString(rw) .

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

Именно эта проблема упоминается в видео, примерно в 09:45. Автор видео говорит, что это можно легко изменить, чтобы отправлять сообщения не только напрямую подключенным одноранговым узлам, но и нескольким хостам. Но как это можно сделать?

Моя цель — отправить сообщение от одного однорангового узла, чтобы все остальные одноранговые узлы в сети, а также не подключенные напрямую, могли получать (и отвечать) на него.

Ответ №1:

Лучший способ отправлять многоадресные или широковещательные сообщения в libp2p — использовать PubSub, чтобы каждый узел, подписанный на тему, получал уведомления об отправленных сообщениях, несмотря на то, что он не подключен напрямую к узлу-отправителю.

Вы можете найти пример реализации с использованием Pubsub здесь . Он использует реализацию gossibSub из libp2p.

Комментарии:

1. PS: Я добавил пример в репозиторий примеров libp2p, и запрос на извлечение ожидает объединения.

2. github.com/libp2p/go-libp2p-examples/tree/master/pubsub