> Как организовать буферизацию данных для предотвращения потери сообщений (Go)

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

Компании: BrightPattern

Стек: Go

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

Для предотвращения потери сообщений в Go можно использовать буферизацию с помощью каналов с буфером и паттерна fan-out/fan-in. Вот пример:

GO
type Buffer struct {
ch chan Message
wg sync.WaitGroup
done 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 nil
case <-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 канал гарантирует обработку всех сообщений.
  • Несколько воркеров обеспечивают параллельную обработку без блокировки.

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

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