2023-04-22 08:58:14 +00:00
|
|
|
|
# gossip
|
|
|
|
|
|
|
|
|
|
В этой задаче вам нужно придумать и реализовать протокол gossip.
|
|
|
|
|
|
|
|
|
|
Gossip-ом называют протоколы, которые применяют в распределённых системах без
|
|
|
|
|
центральной конфигурации, чтобы обнаруживать участников протокола. Участники
|
|
|
|
|
протокола периодически рассказывают друг другу про своих соседей, так что
|
|
|
|
|
каждый "пир" (peer) знает всё про всех. Новому "пир"-у достаточно подключиться
|
|
|
|
|
к одному из членов группы, чтобы узнать про всех остальных.
|
|
|
|
|
|
|
|
|
|
Протокол вам нужно придумать самим, но он должен соответствовать интерфейсу и
|
|
|
|
|
иметь нужные свойства.
|
|
|
|
|
|
|
|
|
|
* Каждый участник протокола имеет уникальный идентификатор, совпадающий с его адресом.
|
|
|
|
|
Этот адрес/идентификатор передаётся вам в конструкторе.
|
|
|
|
|
* Каждый участник знает метаданные про себя. Метаданные описываются типом `*meshpb.PeerMeta`.
|
|
|
|
|
Метаданные могут обновляться в процессе работы.
|
|
|
|
|
* Каждый участник eventually должен узнать идентификаторы и метаданные всех остальных участников.
|
|
|
|
|
Снепшот этой информации должен возвращать метод `GetMembers`.
|
|
|
|
|
* Метод `AddSeed` добавляет адрес `seed`-а. По этому адресу может находиться другой участник
|
|
|
|
|
(а может и не находиться). Адрес нужно использовать, чтобы пытаться подключиться к группе.
|
|
|
|
|
Нельзя считать, что `seed` существует (возвращать его из GetMembers), пока к нему не удалось
|
|
|
|
|
подключиться.
|
|
|
|
|
* Если какой-то из участников становится недоступным (перестаёт отвечать на RPC вызовы), то он должен
|
|
|
|
|
быть удалён из группы (метод `GetMembers` должен перестать возвращать его).
|
|
|
|
|
* Сам `Peer` должен реализовывать `GossipService` из `.proto` файла. Конструктор `NewPeer`
|
|
|
|
|
не должен запускать горутины, это должен делать метод `Run`. Метод `Stop` должен
|
|
|
|
|
завершать все горутины.
|
|
|
|
|
|
|
|
|
|
Ваш протокол должен работать поверх GRPC, поэтому в начале ознакомьтесь
|
|
|
|
|
с [tutorial](https://grpc.io/docs/languages/go/basics/) по GRPC.
|
|
|
|
|
|
|
|
|
|
## Установка protoc
|
|
|
|
|
|
|
|
|
|
В этом задании вам нужно будет генерировать код для работы с GRPC.
|
|
|
|
|
|
|
|
|
|
Для того, чтобы заработал генератор, вам нужно установить несколько утилит.
|
|
|
|
|
Установите их по [инструкции](https://grpc.io/docs/languages/go/quickstart/#prerequisites).
|
|
|
|
|
После установки, у вас в PATH должны появиться 3 команды. Проверьте это:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
protoc --help
|
|
|
|
|
protoc-gen-go --help
|
|
|
|
|
protoc-gen-go-grpc --help
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Генерация кода
|
|
|
|
|
|
|
|
|
|
Описание protobuf сообщений и сервисов находится в файле `meshpb/protocol.proto`
|
|
|
|
|
|
2023-04-26 06:15:23 +00:00
|
|
|
|
Команда для генерации записана в `Makefile`. Чтобы запустить её, перейдите в директорию `gossip` и выполните команду `make`.
|
2023-04-22 08:58:14 +00:00
|
|
|
|
|
|
|
|
|
```
|
2023-04-26 06:15:23 +00:00
|
|
|
|
prime@fedora ~/C/shad-go (master)> cd gossip/
|
|
|
|
|
prime@fedora ~/C/s/gossip (master)> make
|
2023-04-22 08:58:14 +00:00
|
|
|
|
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative meshpb/protocol.proto
|
|
|
|
|
```
|