Sync Engine — Движок синхронизации¶
Уровень: L2 (details) | ← Назад
Обзор¶
Sync Engine обеспечивает надёжную синхронизацию локальных изменений с сервером. Использует очередь операций с зависимостями, exponential backoff retry и автоматическое восстановление при сбоях.
State Diagram: Жизненный цикл операции¶
stateDiagram-v2
[*] --> blocked: depends_on != null
[*] --> queued: depends_on == null
blocked --> queued: dependency done
queued --> running: processQueue()
running --> done: success
running --> failed: error
failed --> queued: retry (count < 5)
failed --> [*]: max retries exceeded
done --> [*]: pruneCompleted()
note right of blocked
Ожидает завершения
зависимой операции
(upload → create)
end note
note right of failed
Exponential backoff
1s → 2s → 4s → 8s → 16s
Max 60s, jitter ±20%
end note

Sequence Diagram: Полный цикл синхронизации¶
sequenceDiagram
participant UI as User Action
participant Svc as offlineService
participant DB as IndexedDB
participant Queue as operationQueue
participant Engine as syncEngine
participant Net as networkStatus
participant API as Backend API
UI->>Svc: create/update/delete
Svc->>DB: Записать локально (instant)
Svc->>Queue: enqueue(operation)
Queue->>DB: pending_operations.put()
Svc->>Engine: processQueue()
Engine->>Net: online?
alt Online
Engine->>Queue: getReady()
Queue-->>Engine: [op1, op2, ...]
loop Для каждой операции
Engine->>Queue: markRunning(op.id)
Engine->>API: HTTP request
alt Success
API-->>Engine: 200 OK
Engine->>Queue: markDone(op.id)
Engine->>DB: Обновить entity (server_id, sync_status)
Engine->>Queue: Разблокировать зависимые
else Failure
API-->>Engine: Error
Engine->>Queue: markFailed(op.id, error)
alt retry_count < 5
Note over Queue: setTimeout(retryDelay)
Queue->>Queue: status → queued (after delay)
Queue->>Engine: processQueue()
else max retries
Engine->>DB: Rollback soft-delete
end
end
end
Engine->>Queue: getReady() (check for unblocked)
else Offline
Note over Engine: Ждёт online event
Net-->>Engine: online!
Engine->>Engine: processQueue()
end

Flowchart: Алгоритм принятия решений¶
flowchart TD
Start([Триггер]) --> CheckRunning{Engine running?}
CheckRunning -->|Да| Skip([Return])
CheckRunning -->|Нет| CheckOnline{Online?}
CheckOnline -->|Нет| Wait([Ждать online event])
CheckOnline -->|Да| GetReady[getReady operations]
GetReady --> HasOps{Есть операции?}
HasOps -->|Нет| Done([Завершить])
HasOps -->|Да| MarkRunning[markRunning]
MarkRunning --> Execute[Execute operation]
Execute --> Success{Успех?}
Success -->|Да| MarkDone[markDone + unblock deps]
Success -->|Нет| CheckRetry{retry < 5?}
CheckRetry -->|Да| MarkFailed[markFailed + schedule retry]
CheckRetry -->|Нет| Rollback[Rollback + permanent fail]
MarkDone --> Invalidate[Invalidate React Query]
MarkFailed --> NextOp
Rollback --> NextOp
Invalidate --> NextOp{Ещё операци��?}
NextOp -->|Да| MarkRunning
NextOp -->|Нет| GetReady

Ключевые параметры¶
| Параметр | Значение | Описание |
|---|---|---|
| Max retries | 5 | Максимум повторных попыток |
| Base delay | 1000ms | Начальная задержка |
| Max delay | 60000ms | Максимальная задержка |
| Backoff | Exponential (×2) | Удвоение на каждой попытке |
| Jitter | ±20% | Случайное отклонение для предотвращения thundering herd |
| Batch size | 1 (serial) | Операции выполняются последовательно |
| Queue order | FIFO | Первым создан → первым выполнен |
Типы операций¶
| Тип | Описание | Зависимости |
|---|---|---|
ITEM_MEDIA_UPLOAD |
З��грузка фото вещи | — |
ITEM_CREATE |
Создание вещи на сервере | → ITEM_MEDIA_UPLOAD |
ITEM_UPDATE |
Обновление вещи | → ITEM_CREATE |
ITEM_DELETE |
Удаление вещи | → ITEM_CREATE |
OUTFIT_CREATE |
Создание образа | — |
OUTFIT_UPDATE |
Обновление образа | → OUTFIT_CREATE |
OUTFIT_DELETE |
Удаление образа | — |
EMBEDDING_REFRESH |
Обновление эмбеддинга | — |
Навигация¶
- → Очередь операций — структура, enqueue/dequeue
- → Retry Policy — backoff, jitter, max retries
- → Цикл синхронизации — полный код syncEngine
- ← Назад к обзору