> Как реализована репликация таблиц (Go)

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

Компании: Сбер

Стек: Go

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

Репликация таблиц в Go-проектах обычно реализуется на уровне базы данных, а не самого языка. Однако, если требуется логическая репликация на стороне приложения, часто используется паттерн "Change Data Capture" (CDC) с применением брокеров сообщений (Kafka, NATS) или триггеров БД.

Пример простой репликации в Go с использованием PostgreSQL и логического декодирования (wal2json):

GO
package main
import (
"context"
"github.com/jackc/pglogrepl"
"github.com/jackc/pgx/v5/pgconn"
)
func replicateTable(ctx context.Context, conn *pgconn.PgConn, slotName string) error {
// Создаем слот репликации
_, err := pglogrepl.CreateReplicationSlot(ctx, conn, slotName, "pgoutput")
if err != nil {
return err
}
// Запускаем поток репликации
err = pglogrepl.StartReplication(ctx, conn, slotName, 0, pglogrepl.StartReplicationOptions{})
if err != nil {
return err
}
for {
msg, err := conn.ReceiveMessage(ctx)
if err != nil {
return err
}
switch m := msg.(type) {
case *pgconn.CopyData:
// Парсим WAL-запись и применяем к целевой таблице
// Здесь логика трансформации и записи в другую БД
}
}
}

Для простых сценариев (например, репликация между двумя экземплярами одной БД) достаточно встроенных средств СУБД (streaming replication в PostgreSQL, group replication в MySQL). В Go тогда не требуется специального кода - только настройка конфигурации.

Если же нужна асинхронная репликация с разными СУБД, часто используют паттерн "Outbox": запись в таблицу-очередь, затем воркер читает и отправляет изменения через брокер. Это гарантирует надежность и идемпотентность.

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

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