shad-go/gossip
2023-05-03 11:52:47 +04:00
..
meshpb Fix typos in meshpb 2023-05-03 11:52:47 +04:00
gossip.go Add gossip task 2023-04-22 12:58:14 +04:00
gossip_test.go Try fixing flaky test 2023-04-22 13:18:36 +04:00
Makefile Add gossip task 2023-04-22 12:58:14 +04:00
README.md rename directory servicemesh to gossip 2023-05-03 11:51:51 +04:00

gossip

В этой задаче вам нужно придумать и реализовать протокол gossip.

Gossip-ом называют протоколы, которые применяют в распределённых системах без центральной конфигурации, чтобы обнаруживать участников протокола. Участники протокола периодически рассказывают друг другу про своих соседей, так что каждый "пир" (peer) знает всё про всех. Новому "пир"-у достаточно подключиться к одному из членов группы, чтобы узнать про всех остальных.

Протокол вам нужно придумать самим, но он должен соответствовать интерфейсу и иметь нужные свойства.

  • Каждый участник протокола имеет уникальный идентификатор, совпадающий с его адресом. Этот адрес/идентификатор передаётся вам в конструкторе.
  • Каждый участник знает метаданные про себя. Метаданные описываются типом *meshpb.PeerMeta. Метаданные могут обновляться в процессе работы.
  • Каждый участник eventually должен узнать идентификаторы и метаданные всех остальных участников. Снепшот этой информации должен возвращать метод GetMembers.
  • Метод AddSeed добавляет адрес seed-а. По этому адресу может находиться другой участник (а может и не находиться). Адрес нужно использовать, чтобы пытаться подключиться к группе. Нельзя считать, что seed существует (возвращать его из GetMembers), пока к нему не удалось подключиться.
  • Если какой-то из участников становится недоступным (перестаёт отвечать на RPC вызовы), то он должен быть удалён из группы (метод GetMembers должен перестать возвращать его).
  • Сам Peer должен реализовывать GossipService из .proto файла. Конструктор NewPeer не должен запускать горутины, это должен делать метод Run. Метод Stop должен завершать все горутины.

Ваш протокол должен работать поверх GRPC, поэтому в начале ознакомьтесь с tutorial по GRPC.

Установка protoc

В этом задании вам нужно будет генерировать код для работы с GRPC.

Для того, чтобы заработал генератор, вам нужно установить несколько утилит. Установите их по инструкции. После установки, у вас в PATH должны появиться 3 команды. Проверьте это:

protoc --help
protoc-gen-go --help
protoc-gen-go-grpc --help

Генерация кода

Описание protobuf сообщений и сервисов находится в файле meshpb/protocol.proto

Команда для генерации записана в Makefile. Чтобы запустить её, перейдите в директорию gossip и выполните команду make.

prime@fedora ~/C/shad-go (master)> cd gossip/
prime@fedora ~/C/s/gossip (master)> make
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative meshpb/protocol.proto