FreemiumProBusinessEnterprise

Как работает синхронизация

SyncEngine

SyncEngine -- центральный компонент оффлайн-архитектуры evntflo. Он отвечает за:

  • Сохранение изменений в локальную базу данных (IndexedDB через Dexie.js)
  • Отслеживание изменений, ожидающих синхронизации (pendingSync=true)
  • Отправку изменений на сервер при восстановлении связи
  • Получение обновлений с сервера (delta sync)
  • Дедупликацию для предотвращения дублей

Жизненный цикл изменения

1. Создание изменения

Когда вы выполняете действие (например, check-in участника), SyncEngine:

  1. Записывает изменение в IndexedDB с флагом pendingSync=true
  2. Присваивает метку времени clientTs (текущее время на устройстве)
  3. Увеличивает счетчик ожидающих изменений в индикаторе
  4. Немедленно отражает изменение в интерфейсе (оптимистичное обновление)

2. Отправка на сервер

При наличии соединения SyncEngine:

  1. Извлекает все записи с pendingSync=true
  2. Сортирует их по clientTs (от старых к новым)
  3. Отправляет пакетом на сервер
  4. Ожидает подтверждения от сервера

3. Подтверждение

После успешного ответа сервера:

  1. Флаг pendingSync снимается (false) для каждой отправленной записи
  2. Счетчик ожидающих изменений уменьшается
  3. Если все изменения отправлены, индикатор переключается на зеленый

4. Обработка ошибок

При ошибке отправки:

  1. Изменения остаются с pendingSync=true
  2. Повторная попытка выполняется через 30 секунд
  3. Максимум 5 попыток, после чего -- уведомление пользователю

Delta sync

Delta sync позволяет получать с сервера только те данные, которые изменились после последней синхронизации, вместо загрузки всего набора данных.

Как это работает

  1. SyncEngine хранит метку времени последней успешной синхронизации в таблице meta.
  2. При синхронизации отправляется запрос с параметром since:
GET /sync/delta?since=2026-07-15T10:30:00Z&entities=registrations,payments
  1. Сервер возвращает только записи, измененные после указанного времени.
  2. SyncEngine обновляет локальную базу данных и сохраняет новую метку времени.

Параметры запроса

ПараметрОписание
sinceISO 8601 метка времени последней успешной синхронизации
entitiesСписок типов сущностей через запятую: registrations, payments, events

Преимущества

  • Экономия трафика. Передаются только изменения, а не все данные
  • Быстрота. Синхронизация занимает секунды, а не минуты
  • Надежность. Если синхронизация прервалась, следующая попытка начнет с того же since

Автоматическая синхронизация

SyncEngine отслеживает состояние сети и автоматически запускает синхронизацию в следующих случаях:

При восстановлении связи

Когда устройство переходит из оффлайн в онлайн:

  1. Обнаруживается событие online (Network Information API)
  2. SyncEngine проверяет доступность сервера (ping)
  3. Отправляются ожидающие изменения (upload)
  4. Запрашиваются обновления с сервера (download via delta sync)

Периодическая синхронизация

В онлайн-режиме SyncEngine периодически проверяет наличие обновлений на сервере, чтобы данные оставались актуальными (например, если другой член команды отметил check-in с другого устройства).

Дедупликация

Для предотвращения дублирования изменений используется композитный ключ:

clientTs + userId

Каждое изменение уникально идентифицируется комбинацией метки времени создания на клиенте и идентификатора пользователя. Если одно и то же изменение отправлено повторно (например, из-за сетевого таймаута), сервер распознает дубликат по этому ключу и вернет подтверждение без повторного применения.

Это гарантирует идемпотентность -- повторная отправка одного и того же набора изменений не приводит к ошибкам или дублированию данных.

Порядок синхронизации

Изменения отправляются строго в хронологическом порядке по clientTs. Это критично для корректности:

  • Check-in участника в 10:05 не может быть перезаписан отменой check-in в 10:03
  • Ручная отметка оплаты в 11:00 применяется после изменения статуса в 10:55

Если часы устройства отличаются от серверного времени, SyncEngine компенсирует разницу при первой успешной синхронизации.

Объем локального хранилища

Локальная база данных IndexedDB имеет ограничения, зависящие от браузера и устройства:

ПлатформаТипичный лимит
Chrome / EdgeДо 80% свободного места на диске
SafariДо 1 ГБ
FirefoxДо 2 ГБ

Для типичного мероприятия (до 2 000 участников) объем данных составляет 5-20 МБ, что далеко от лимитов любого браузера.

При приближении к лимиту хранилища SyncEngine показывает предупреждение и предлагает очистить данные завершенных мероприятий.

Частые вопросы

Что такое delta sync?
Delta sync -- это метод синхронизации, при котором передаются только изменения, произошедшие после последней успешной синхронизации, а не все данные целиком. Это экономит трафик и ускоряет процесс.
Может ли одно изменение отправиться дважды?
Нет. Система использует дедупликацию по композитному ключу clientTs + userId. Даже если запрос отправлен повторно (например, из-за таймаута), сервер распознает дубликат и не применит изменение дважды.
В каком порядке синхронизируются изменения?
Строго в хронологическом порядке по метке времени clientTs. Это гарантирует, что более поздние изменения не будут перезаписаны более ранними.