Реализуйте маршрутизатор сообщений. Каждое сообщение имеет Tag. Подписчики
регистрируются на конкретный тег. Опубликованное сообщение доставляется
только обработчикам, подписанным на его Tag.
type Message struct {
Tag string
Payload int
}
type Router struct{ /* ... */ }
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 помещает сообщение в очередь; диспетчер доставляет его всем
обработчикам, подписанным на Tag.
- Сообщения с неизвестным тегом тихо отбрасываются (без паники).
- Потокобезопасность;
Stop дренирует очередь и завершает цикл без утечек.
На что смотрит интервьюер:
- Маршрутизация строго по тегу:
map[string][]handler под мьютексом,
доставка только подходящим подписчикам.
- Потокобезопасный доступ к карте подписчиков и корректный fan-out.
Stop дренирует оставшиеся сообщения и завершает диспетчер без утечек
горутин; отсутствие гонок под -race.
- Неизвестные теги не вызывают паники и не доставляются никому.