БСсплатная ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡ

ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΡŒ. ΠžΡ‚Π²Π΅Ρ‡Ρƒ с практичСским ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом β€” бСсплатно, Π±Π΅Π· ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π².

Или Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ врСмя Π² Calendly

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ offline-first ΠΈ ΠΊΠΎΠ³Π΄Π° это Π½ΡƒΠΆΠ½ΠΎ бизнСсу

Offline-first β€” это Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ Π½Π° устройствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° синхронизация с сСрвСром происходит асинхронно, ΠΊΠΎΠ³Π΄Π° ΡΠ΅Ρ‚ΡŒ доступна. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ Β«Π±Π΅Π»Ρ‹ΠΉ экран оТидания»: Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ сохраняСтся, Π·Π°ΠΊΠ°Π· оформляСтся, Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ° рСдактируСтся β€” Π΄Π°ΠΆΠ΅ Π² ΠΌΠ΅Ρ‚Ρ€ΠΎ ΠΈΠ»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Π±Π΅Π· ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ для ΠΏΠΎΠ»Π΅Π²Ρ‹Ρ… сСрвисов, логистики, мСдицинских ΠΈ retail-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… CRM Π½Π° ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π°Ρ…, SaaS с Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ сСссиями рСдактирования. Π¦Π΅Π½Π° β€” услоТнСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΏΡ€ΠΈ merge ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎΠΉ стратСгии синхронизации. Π‘Π΅Π· Π½Π΅Ρ‘ offline-first прСвращаСтся Π² источник потСрянных Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ нСдовСрия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

АрхитСктура синхронизации Π΄Π°Π½Π½Ρ‹Ρ…

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ стСк offline-first Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Π±Π°Π·Ρƒ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅, транспорт ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ сСрвСрноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ с ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ слияния.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ слой

На Π²Π΅Π±Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ IndexedDB Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ (Dexie, idb), ΠΈΠ½ΠΎΠ³Π΄Π° SQLite Π² WASM ΠΈΠ»ΠΈ PouchDB. На ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… β€” SQLite, Realm, WatermelonDB. ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ:

  • Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ записи локально;
  • ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ исходящих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (outbox) с idempotency key;
  • вСрсионированиС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ CRDT для автоматичСского merge;
  • ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ схСмы локальной Π‘Π” Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ синхронизации.

Вранспорт ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»

Pull β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ измСнСния с послСднСго извСстного checkpoint (sequence, vector clock, revision). Push β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚ отправляСт batch Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ sync сниТаСт Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ. Service Worker ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ push Π² Ρ„ΠΎΠ½Π΅ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΏΡ€ΠΈ восстановлСнии сСти, Π½ΠΎ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ merge Π»ΡƒΡ‡ΡˆΠ΅ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ явной, Π° Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° SW.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ слой

CouchDB ΠΈ PouchDB β€” классичСская ΠΏΠ°Ρ€Π° Β«ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΒ»: Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с _rev, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ вСрсии Π΄ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ автоматичСского merge. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° β€” собствСнный API ΠΏΠΎΠ²Π΅Ρ€Ρ… PostgreSQL ΠΈΠ»ΠΈ MongoDB с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ last-write-wins, CRDT ΠΈΠ»ΠΈ operational transform для тСкстовых ΠΏΠΎΠ»Π΅ΠΉ.

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ

Offline-first Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β« eventual consistency любой Ρ†Π΅Π½ΠΎΠΉΒ». НуТно Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ сСмантику для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° сущности.

  • Last-write-wins (LWW) β€” просто, Π½ΠΎ опасно ΠΏΡ€ΠΈ рассинхронС часов; добавляйтС tie-break ΠΏΠΎ deviceId.
  • Server authority β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚, сСрвСр Ρ€Π΅ΡˆΠ°Π΅Ρ‚; ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для финансовых Π»ΠΈΠΌΠΈΡ‚ΠΎΠ² ΠΈ статусов Π·Π°ΠΊΠ°Π·Π°.
  • CRDT β€” для счётчиков, мноТСств, совмСстного тСкста Π±Π΅Π· Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ блокирования.
  • Explicit merge UI β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π΅; Π½ΡƒΠΆΠ΅Π½ Ρ€Π΅Π΄ΠΊΠΎ, Π½ΠΎ спасаСт Π² ΡŽΡ€ΠΈΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ….

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹: ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Β«conflict rateΒ», Π»ΠΎΠ³ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ support ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΎΠ±Π΅ вСрсии. Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ автоматичСский merge Π±Π΅Π· Π°ΡƒΠ΄ΠΈΡ‚Π° β€” частая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° скандалов с Β«ΠΏΡ€ΠΎΠΏΠ°Π²ΡˆΠΈΠΌΠΈΒ» ΠΏΡ€Π°Π²ΠΊΠ°ΠΌΠΈ.

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, ΠΌΠ°ΡΡˆΡ‚Π°Π± ΠΈ эксплуатация

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ копия Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° устройствС β€” это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ. Π¨ΠΈΡ„Ρ€ΡƒΠΉΡ‚Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля at rest (Web Crypto, SQLCipher), ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ TTL локального кэша, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ remote wipe Ρ‡Π΅Ρ€Π΅Π· push ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ online-login. Π’ΠΎΠΊΠ΅Π½Ρ‹ обновлСния Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎ; offline-сСссия Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π»ΠΈΡ‚ΡŒΡΡ бСсконСчно Π±Π΅Π· re-auth.

На ΠΌΠ°ΡΡˆΡ‚Π°Π±Π΅ растёт ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π΅Π»ΡŒΡ‚ ΠΈ число ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π΅ΠΏΠ»ΠΈΠΊ. ΠŸΠΎΠΌΠΎΠ³Π°Π΅Ρ‚:

  • ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ синхронизация ΠΏΠΎ коллСкциям, Π° Π½Π΅ full dump;
  • сТатиС batch ΠΈ pagination;
  • backpressure: ΠΊΠ»ΠΈΠ΅Π½Ρ‚ замСдляСт push ΠΏΡ€ΠΈ 429/503;
  • ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… сущностСй.

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³: lag синхронизации, Ρ€Π°Π·ΠΌΠ΅Ρ€ outbox, failed sync. АлСрт Π½Π° Ρ€Π΅Π·ΠΊΠΈΠΉ рост outbox часто ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Ρ€Π΅Π»ΠΈΠ·Ρƒ с нСсовмСстимой схСмой.

ΠŸΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΉ ΠΏΠ»Π°Π½ внСдрСния

НС пСрСписывайтС всё ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сразу. Рабочая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:

  • Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ сущности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ offline ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½ (Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΈ, справочники).
  • Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ локальноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈ outbox Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½ΠΈΡ…; UI ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ статус «сохранСно локально / синхронизировано».
  • Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ pull/push с ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° сСрвСрС.
  • ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ тСстами с искусствСнным offline (DevTools, прокси с drop).
  • ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Service Worker для Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ доставки, Ссли Π½ΡƒΠΆΠ΅Π½ PWA-сцСнарий.
  • Нагрузочно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ sync ΠΏΡ€ΠΈ ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ всплСскС послС Π½ΠΎΡ‡ΠΈ Π±Π΅Π· сСти.

PouchDB + CouchDB ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½Π° готовая рСпликация Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Для кастомного бэкСнда Π½Π° Node ΠΈΠ»ΠΈ Python Ρ‡Π°Ρ‰Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ REST ΠΈΠ»ΠΈ GraphQL ΠΏΠΎΠ²Π΅Ρ€Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ events β€” Π³ΠΈΠ±Ρ‡Π΅, Π½ΠΎ Π΄ΠΎΡ€ΠΎΠΆΠ΅ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ

  • Двойная запись Π±Π΅Π· outbox β€” ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ сСти послС POST Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ; всСгда сначала локально, ΠΏΠΎΡ‚ΠΎΠΌ sync.
  • Optimistic UI Π±Π΅Π· ΠΎΡ‚ΠΊΠ°Ρ‚Π° β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΈΡ‚ успСх, Π° сСрвСр ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΠ»; Π½ΡƒΠΆΠ΅Π½ rollback ΠΈ сообщСниС.
  • Full sync ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ β€” ΡƒΠ±ΠΈΠ²Π°Π΅Ρ‚ Π±Π°Ρ‚Π°Ρ€Π΅ΡŽ ΠΈ Ρ‚Π°Ρ€ΠΈΡ„Ρ‹; Ρ‚ΠΎΠ»ΡŒΠΊΠΎ deltas.
  • Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ β€” старыС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π»ΠΎΠΌΠ°ΡŽΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ; вСрсионируйтС API ΠΈ схСму.

Настройка синхронизации для offline-first β€” ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ инТСнСрная Π·Π°Π΄Π°Ρ‡Π°, Π½Π΅ Β«Π³Π°Π»ΠΎΡ‡ΠΊΠ° Π² PWAΒ». Если ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ зависит ΠΎΡ‚ ΠΏΠΎΠ»Π΅Π²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Π΅Π· сСти, ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π·Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ sync Π½Π° этапС проСктирования, Π° Π½Π΅ послС ΠΆΠ°Π»ΠΎΠ± ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π Π°Π·Π±ΠΎΡ€ вашСго кСйса ΠΈ Π²Ρ‹Π±ΠΎΡ€ стСка β€” Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ offline-first.

АрхитСктура ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

НадёТный offline-first ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда строится Π²ΠΎΠΊΡ€ΡƒΠ³ локального outbox: ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ сначала ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π½Π° устройство, Π·Π°Ρ‚Π΅ΠΌ синхронизируСтся. UI Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ локальноС состояниС, Π° ΡΠ΅Ρ‚ΡŒ β€” это Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ транспорт, Π° Π½Π΅ источник истины Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΊΠ»ΠΈΠΊΠ°.

ΠŸΡ€ΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚-Ρ€Π΅Π·ΠΎΠ»ΡŽΡ†ΠΈΡŽ Π·Π°Ρ€Π°Π½Π΅Π΅: last-write-wins ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для части ΠΏΠΎΠ»Π΅ΠΉ, Π½ΠΎ для списков, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ совмСстного рСдактирования Π½ΡƒΠΆΠ½Ρ‹ CRDT ΠΈΠ»ΠΈ явный merge UX. Service Worker ΠΈ кэш статики Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Β«ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΎΡΡŒΒ», Π½ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ модСль Π΄Π°Π½Π½Ρ‹Ρ….

  • Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ Π‘Π” (SQLite/IndexedDB/PouchDB) ΠΊΠ°ΠΊ primary store Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅
  • Π˜Π΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½Ρ‹Π΅ sync-эндпоинты ΠΈ курсоры/checkpoints
  • Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Β«ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈΒ» ΠΈ Β«ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΒ»
  • ВСсты Π½Π° airplane mode ΠΈ смСну сСти mid-flight

Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ€Π΅Π»ΠΈΠ·ΠΎΠΌ

Π‘ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠΉΡ‚Π΅ дСнь ΠΏΠΎΠ»Π΅Π²ΠΎΠ³ΠΎ сотрудника: Π΄ΠΎΠ»Π³ΠΈΠΉ offline, ΠΏΠ°Ρ‡ΠΊΠ° ΠΏΡ€Π°Π²ΠΎΠΊ, Π·Π°Ρ‚Π΅ΠΌ слабый 3G. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ тСряСт ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠ΅Ρ‚ сущности. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ logout/login Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ устройствС β€” синхронизация Π΄ΠΎΠ»ΠΆΠ½Π° Π΄ΠΎΠ³ΠΎΠ½ΡΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ экспорта.

Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° Π±Π΅ΡΠΏΠ»Π°Ρ‚Π½ΡƒΡŽ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡŽ.