Перейти к содержанию

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 Обновление эмбеддинга

Навигация