Нужен маршрутизатор сообщений. У каждого сообщения есть тег, подписчики
записываются на конкретный тег, и сообщение достаётся только им.
Тип Message уже объявлен в support.go, его писать не нужно:
type Message struct {
Tag string
Payload int
}
Вам нужно реализовать Router:
func NewRouter() *Router
func (r *Router) Subscribe(tag string, handler func(Message))
func (r *Router) Publish(msg Message)
func (r *Router) Start()
func (r *Router) Stop()
Требования:
Subscribe добавляет обработчик на тег. На один тег можно подписать
несколько обработчиков, и каждое сообщение с этим тегом получат все.
Publish только ставит сообщение в очередь. Доставляет его отдельная
горутина-диспетчер, которую запускает Start.
- Сообщение с тегом, на который никто не подписан, молча пропадает. Паники быть
не должно.
Stop дожидается, пока будут доставлены все сообщения, которые к этому
моменту уже поставлены в очередь, и завершает диспетчер. После возврата из
Stop ни одна горутина пула не живёт.
- Все методы безопасны для вызова из разных горутин, код проходит
go test -race.
Пример:
r := NewRouter()
r.Subscribe("logs", func(m Message) { fmt.Println("logs:", m.Payload) })
r.Subscribe("logs", func(m Message) { fmt.Println("audit:", m.Payload) })
r.Start()
r.Publish(Message{Tag: "logs", Payload: 1})
r.Publish(Message{Tag: "metrics", Payload: 2}) // подписчиков нет, сообщение пропадает
r.Stop()
Вывод (оба обработчика сработали по одному разу, про metrics ни слова):
logs: 1
audit: 1
Правила вызова. Сначала Start, потом Publish. Все вызовы Publish
должны вернуться до Stop, после Stop публиковать нельзя. Обработчики
не должны блокироваться навсегда.
Тесты проверяют: доставку по тегу (подписчик получает ровно свои сообщения с нужными значениями, неизвестный тег пропадает), всех подписчиков одного тега, то, что Stop возвращается только после доставки всей очереди (с медленным обработчиком), параллельные Publish и Subscribe под -race и отсутствие лишних горутин после Stop.
Что проверяют на собеседовании: карту подписчиков под мьютексом, доставку
строго по тегу, чистый Stop без потерянных сообщений и утёкших горутин.