> Как передать данные от одного сервиса к множеству читателей с брокером сообщений (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для передачи данных от одного сервиса к множеству читателей с брокером сообщений в Go используется паттерн pub/sub (publish/subscribe). Брокер (например, RabbitMQ, NATS, Kafka) принимает сообщение от продюсера и доставляет его всем подписанным консюмерам.

Пример на Go с использованием NATS (популярный легковесный брокер):

GO
package main
import (
"log"
"github.com/nats-io/nats.go"
)
func main() {
// Подключение к NATS
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
// Продюсер: отправка сообщения всем подписчикам на тему "orders"
nc.Publish("orders", []byte("Новый заказ #123"))
// Консюмер 1: подписка на тему
nc.Subscribe("orders", func(m *nats.Msg) {
log.Printf("Сервис A получил: %s", string(m.Data))
})
// Консюмер 2: другая подписка на ту же тему
nc.Subscribe("orders", func(m *nats.Msg) {
log.Printf("Сервис B получил: %s", string(m.Data))
})
// Блокировка для ожидания сообщений
select {}
}

Ключевые моменты:

  • Используется topic (тема) для группировки сообщений.
  • Каждый подписчик получает копию сообщения (fan-out).
  • Для гарантии доставки при сбоях используйте durable subscriptions (NATS) или очереди с подтверждением (RabbitMQ).
  • Для масштабирования можно использовать группы консюмеров (queue groups в NATS или competing consumers в RabbitMQ), но это уже распределение нагрузки, а не вещание.

Альтернативы: RabbitMQ с exchange типа fanout, Kafka с consumer groups (каждый читает все сообщения из партиции).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью