> Как организовать буферизацию данных для предотвращения потери сообщений (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: BrightPattern
Стек: Go
> Пример ответа
Для предотвращения потери сообщений в Go можно использовать буферизацию с помощью каналов с буфером и паттерна fan-out/fan-in. Вот пример:
GOtype Buffer struct {ch chan Messagewg sync.WaitGroupdone chan struct{}}func NewBuffer(size int) *Buffer {return &Buffer{ch: make(chan Message, size),done: make(chan struct{}),}}func (b *Buffer) Start(workers int, process func(Message)) {for i := 0; i < workers; i++ {b.wg.Add(1)go func() {defer b.wg.Done()for {select {case msg, ok := <-b.ch:if !ok {return}process(msg)case <-b.done:return}}}()}}func (b *Buffer) Send(msg Message) error {select {case b.ch <- msg:return nilcase <-b.done:return errors.New("buffer closed")default:// Буфер переполнен - можно сохранить в резервное хранилищеreturn b.saveToBackup(msg)}}func (b *Buffer) Stop() {close(b.done)close(b.ch)b.wg.Wait()}
Ключевые моменты:
- Канал с буфером (размер задаётся) сглаживает пиковые нагрузки.
- При переполнении данные сохраняются в резервное хранилище (файл, БД).
- Graceful shutdown через
doneканал гарантирует обработку всех сообщений. - Несколько воркеров обеспечивают параллельную обработку без блокировки.
> Похожие задачи по Go
Как организовать запись данных из WebSocket в базу данных и кэш
Как использовать паттерн outbox для обработки задержек записи в базу и обеспечения отказоустойчивости
Как организовать таблицы и шардирование для хранения исторических данных
Какие оптимизации запросов с PostgreSQL вы делали
> Похожие задачи по backend
Как организовать запись данных из WebSocket в базу данных и кэш
Как использовать паттерн outbox для обработки задержек записи в базу и обеспечения отказоустойчивости
Как организовать таблицы и шардирование для хранения исторических данных
Какие оптимизации запросов с PostgreSQL вы делали
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью