> Как реализована репликация таблиц (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Сбер
Стек: Go
> Пример ответа
Репликация таблиц в Go-проектах обычно реализуется на уровне базы данных, а не самого языка. Однако, если требуется логическая репликация на стороне приложения, часто используется паттерн "Change Data Capture" (CDC) с применением брокеров сообщений (Kafka, NATS) или триггеров БД.
Пример простой репликации в Go с использованием PostgreSQL и логического декодирования (wal2json):
GOpackage mainimport ("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": запись в таблицу-очередь, затем воркер читает и отправляет изменения через брокер. Это гарантирует надежность и идемпотентность.
> Похожие задачи по backend
Столкнулись ли вы с проблемами нагруженности таблиц и как их решали
Работали ли вы с репликацией таблиц
Могут ли процессы и потоки общаться между собой и как
Почему Kafka такая быстрая
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью