Реализуется пакет subpub, который предоставляет шину событий в стиле Publisher-Subscriber. При этом каждый subject может иметь множество подписчиков, при публикации сообщений гарантируется их последовательная (FIFO) доставка каждому подписчику. Каждый подписчик обрабатывается в своём горутине, поэтому медленный обработчик не тормозит остальных. При вызове метода Close шина должна корректно завершать работу, при этом учитывая переданный контекст (если контекст отменён – выходим сразу, оставляя уже запущенные хендлеры работать, но не допуская утечек горутин).
Во второй части создаётся gRPC‑сервис, который использует пакет subpub для реализации потоковой подписки и публикации событий по ключу. Клиент может подписаться, получая поток событий, либо опубликовать событие, после чего оно транслируется всем подписчикам соответствующего ключа. Для вопросов успешности/неуспешности используются стандартные коды из пакетов google.golang.org/grpc/status и google.golang.org/grpc/codes.
Используемые паттерны и моменты:
- Dependency Injection: Экземпляр шины событий (
subpub.SubPub) создаётся в точке входа и передается в реализациюgRPC‑сервиса. - Graceful Shutdown: При получении сигналов завершения (
SIGINT/SIGTERM) сервер останавливается – сначала вызываетсяgrpc.GracefulStop(), затем методCloseшины с таймаутом. - Конфигурация: Параметры сервиса (например, порт) задаются через конфигурационный объект (через флаги).
- Логирование: Пример использует стандартный пакет log.