Ответ
В Go реплики (копии сервиса) могут поддерживать одинаковое состояние через:
- Распределенные хранилища (Redis, etcd, PostgreSQL) — общая точка истины.
- Gossip-протоколы (memberlist) — децентрализованный обмен состояниями.
- 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.