Синхронизация состояния в распределённых системах

Распределённые системы имеют кучу подводных граблей. Синхронизация состояния сама по себе нетривиальная задача, которой посвящены многие работы. А уж если состояние распределено по системе…

Синхронизация состояния в распределённых системах

Всем привет!

План

  1. кеш во внешнем сервисе
  2. кеш внутри сервиса
  3. шардирование

Не используйте, если можете

Кеш во внешнем сервисе

Кеш во внешнем сервисе

Кеш во внешнем сервисе

Идеален, если

Кеш во внешнем сервисе

Проблемы:

Кеш во внешнем сервисе

</figcaption>

Локи

Кеш во внешнем сервисе

Проблемы:

local c = redis.call("HGET", KEYS[1], ARGV[1])
if c == nil or tonumber(c) <= -tonumber(ARGV[2]) then
    redis.call("HDEL", KEYS[1], ARGV[1])
    return 0
end
redis.call("HINCRBY", KEYS[1], ARGV[1], ARGV[2])
local updatedCount = redis.call("HGET", KEYS[1], ARGV[1])
return tonumber(updatedCount)

Кеш внутри сервиса

Кеш внутри сервиса

Почему?

Кеш внутри сервиса

Что можно делать?

Кеш внутри сервиса

Оповещение об инвалидации:

Кеш внутри сервиса

Флаг

Расхождение часов

Расхождение часов

ts := time.Now().UTC()
claims := &jwt.StandardClaims{
    IssuedAt: ts.Add(-deviateIssuedAt).Unix(),
    ExpiresAt: ts.Add(validTTL).Unix(),
}

Расхождение часов

</figcaption>

Шардирование

Шардирование

За определённое состояние должен отвечать только один сервис