Local-first архитектура — Metarhia

Видение автора: вся бизнес-логика и данные живут на клиенте. Сервер опционален. Синхронизация — отдельный слой через CRDT и Metacom-proxy.

Принцип

«UI и бизнес-логика работают как будто с локальным сториджем. А синхронизация идёт фоном. Из-за того, что у нас всё отделено одно от другого Global Storage, это как раз и есть принцип Local-first.»

Изоляция слоёв

┌─ UI (React/Vue/...)
├─ Global Storage (локальная реактивная СУБД)
├─ Бизнес-логика (изолирована от UI и сети)
└─ Sync layer (CRDT + Metacom + WebSocket/WebRTC)
  • UI ⟂ бизнес-логика
  • бизнес-логика ⟂ сеть
  • всё координируется через Global Storage

Где запускается бизнес-логика

Бизнес-логика написана один раз, исполняется в любой из сред:

  • В таб-вкладке
  • В Service Worker (через MessagePort)
  • На сервере (Impress)
  • В тестах (mock-транспорт)

Strategy-паттерн на уровне исполнителя бизнес-логики.

Что значит «локальный сторидж»

UI и бизнес-логика дёргают Global Storage как локальную БД. Не знают, реплицируется ли это куда-то.

// UI пишет в локальный store
await store.users.update(123, { name: 'Roma' });

// Sync layer фоном синхронизирует через CRDT и Metacom

Дублирование кода

Бизнес-логика дублируется (или загружается) и в таб, и в Service Worker. Не одновременно — выбираешь, где исполнять. На сервере тоже можно запускать тот же код (изоморфность).

Подменяемые стратегии

  • Транспорт — WebSocket / WebRTC / MessagePort.
  • Storage — OPFS / IndexedDB / Postgres / Redis / Oracle.
  • Sync — CRDT / operation log / patch-based / pessimistic.

Это «архитектура как лего» — собирается из взаимозаменяемых блоков.

DDD и local-first

В DDD надо абстрагироваться от инфраструктуры (базы). Local-first это пушит дальше: бизнес-логика просто работает с реактивной локальной СУБД, а синхронизация — не её забота.

«Мы перестали писать код, кроме кода доменной области или кода, который реально просто фронтенный код. Все эти фичи синхронизации, storage — решено автоматически.»

Что отдать на откуп библиотеке

«Если синхронизацию состояния отдавать на откуп программистам, то они её всегда начинают переизобретать. Она хорошо может быть сделана, если это будет вынесено на специальный слой синхронизации, отдельная библиотека.»

Стек технологий

  • Metacom — RPC + state sync
  • Service Worker — общий прокси для всех вкладок
  • WebSocket — основной транспорт
  • WebRTC — P2P, обход сервера
  • OPFS — быстрая локальная файловая система
  • CRDT — merge без конфликтов
  • Web Crypto — подписи операций
  • Blockchain — discovery адресов нод

Зрелость

«Local-first ещё не упаковали для всех. Реализации были давно. Но пользоваться этим ещё не очень принято.»

Tinybase, Replicache, Yjs, Automerge — известные библиотеки. В Metarhia делается своя интегрированная реализация.

🎓 Источники

См. также