Как реплики поддерживают одинаковое состояние

«Как реплики поддерживают одинаковое состояние» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go реплики (копии сервиса) могут поддерживать одинаковое состояние через:

  1. Распределенные хранилища (Redis, etcd, PostgreSQL) — общая точка истины.
  2. Gossip-протоколы (memberlist) — децентрализованный обмен состояниями.
  3. Raft/Paxos (hashicorp/raft) — консенсус для строгой согласованности.

Пример с Redis:

// Обновление состояния
func UpdateCounter(key string, delta int) error {
    client := redis.NewClient(&redis.Options{Addr: "redis:6379"})
    return client.IncrBy(key, int64(delta)).Err()
}

Нюансы:

  • CAP-теорема: выбирайте между согласованностью (CP) и доступностью (AP).
  • Задержки сети: кэшируйте локально с TTL.
  • Конфликты: используйте версионирование (например, через векторные часы).

Для простых случаев подходит Redis, для сложных — Raft.