Безопасная кросс-серверная синхронизация инвентарей и экономики через Redis Locks
1. Почему наивная запись в SQL при выходе с сервера приводит к дюпам
Когда игрок переходит через Velocity с одной ноды на другую (`anarchy-1` → `duels-1`), сервер назначения начинает загрузку профиля одновременно с тем, как исходный сервер сохраняет инвентарь на диск. Без распределённой блокировки новый сервер может прочитать устаревший снимок до завершения транзакции сохранения.
2. Атомарная блокировка профиля (Distributed Lock) в Redis
Наш плагин XMC-SyncBridge захватывает ключ блокировки xmc:lock:player:<uuid> с TTL 3 000 мс. Пока исходная нода не сериализует `ItemStack[]` в бинарный Zstd-блоб и не опубликует событие SYNC_COMMIT в канал Redis Pub/Sub, целевая нода удерживает вход игрока на этапе конфигурации Velocity.
Пример состояния ключа синхронизации в Redis
HSET xmc:profile:550e8400-e29b-41d4-a716-446655440000 \
version 418 \
rubies 2840 \
elo 1945 \
last_node "duels-1" \
commit_ts "2026-11-13T16:38:12Z"