Как несколько экземпляров (реплик) одного backend-сервиса могут поддерживать согласованное состояние?

Ответ

Для поддержания согласованного (синхронизированного) состояния между несколькими репликами сервиса используются различные подходы, выбор которых зависит от требований к системе (в частности, от теоремы CAP — согласованность, доступность, устойчивость к разделению).

Основные стратегии:

  1. Централизованное (внешнее) хранилище: Состояние выносится во внешнюю систему, которая становится единственным источником правды (Single Source of Truth). Все реплики обращаются к ней для чтения и изменения состояния.

    • Примеры: PostgreSQL, Redis, etcd, Zookeeper.
    • Плюсы: Простота реализации на стороне сервиса.
    • Минусы: Единая точка отказа и потенциальное узкое место.
    // Все реплики используют один и тот же клиент Redis
    func GetValue(client *redis.Client, key string) (string, error) {
        return client.Get(ctx, key).Result()
    }
  2. Протоколы консенсуса (Consensus Protocols): Алгоритмы, позволяющие группе узлов договориться об общем значении. Используются для систем, требующих строгой согласованности (Strong Consistency).

    • Примеры: Raft (используется в etcd, Consul), Paxos.
    • Плюсы: Высокая отказоустойчивость, отсутствие единой точки отказа.
    • Минусы: Сложность реализации и настройки.
    • Go-библиотека: hashicorp/raft.
  3. Gossip-протоколы (Anti-Entropy): Децентрализованный подход, при котором узлы обмениваются информацией о своем состоянии со случайными соседями. Обеспечивает итоговую согласованность (Eventual Consistency).

    • Примеры: Используется в Consul для обнаружения сервисов, в Cassandra для синхронизации.
    • Плюсы: Масштабируемость, отказоустойчивость.
    • Минусы: Нет гарантий по времени синхронизации.
    • Go-библиотека: hashicorp/memberlist.

Ключевые аспекты при выборе:

  • Теорема CAP: Необходимо выбрать компромисс между согласованностью (CP) и доступностью (AP) в случае разделения сети.
  • Конфликты записи: При одновременном изменении данных разными репликами могут возникать конфликты. Для их разрешения используют механизмы вроде векторных часов или стратегии Last-Write-Wins (LWW).