shad-go/gossip/README.md
2023-05-03 11:51:51 +04:00

57 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`
Команда для генерации записана в `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
```