Отказ от трехзвенной архитектуры: клиентский event sourcing и SQLite
Традиционная трехзвенная архитектура веб-приложений — клиент, сервер, база данных — десятилетиями была стандартом. Но с ростом требований к офлайн-работе и производительности разработчики все чаще оглядываются на альтернативы. Йоханнес Шиклинг, известный как создатель ORM Prisma, в недавнем подкасте
Традиционная трехзвенная архитектура веб-приложений — клиент, сервер, база данных — десятилетиями была стандартом. Но с ростом требований к офлайн-работе и производительности разработчики все чаще оглядываются на альтернативы. Йоханнес Шиклинг, известный как создатель ORM Prisma, в недавнем подкасте InfoQ поделился своим опытом перехода на локально-ориентированную архитектуру с клиентским event sourcing и SQLite. Его проект Overtone, приложение для курирования музыки, стал полигоном для экспериментов, которые могут изменить подход к разработке веб-приложений.
Клиентский event sourcing и Overtone: от Prisma к новым принципам
Шиклинг начал с критики традиционного стека. По его словам, трехзвенная архитектура создает лишнюю сложность: сервер становится узким местом, а офлайн-режим требует дублирования логики. В Overtone он применил клиентский event sourcing — все изменения состояния хранятся как последовательность событий на стороне клиента, а SQLite используется как локальное хранилище. Это позволяет приложению работать полностью офлайн, синхронизируясь с сервером только при подключении. Основная идея — сместить акцент с серверной логики на клиентскую, сделав пользовательский опыт приоритетом.
Предыстория и контекст: почему event sourcing, а не CRDT?
Event sourcing — не новая концепция, но обычно она применяется на сервере. Шиклинг выбрал клиентскую реализацию, чтобы избежать проблем с конфликтами, характерными для CRDT (Conflict-Free Replicated Data Types). CRDT популярны в совместных редакторах вроде Google Docs, но для музыкального приложения, где важна последовательность действий (например, порядок треков в плейлисте), event sourcing оказался проще. «CRDT дают автоматическое разрешение конфликтов, но иногда это не нужно — достаточно линейной истории событий», — поясняет он. SQLite, в свою очередь, обеспечивает надежное локальное хранение без необходимости в полноценной серверной БД.
Как клиентский event sourcing работает на практике?
В Overtone каждое действие пользователя — добавление трека, изменение порядка, оценка — записывается как событие в локальную базу SQLite. Эти события формируют журнал, который воспроизводится для восстановления состояния. При подключении к интернету журнал отправляется на сервер, который проверяет корректность и сохраняет глобальное состояние. Такой подход гарантирует, что приложение всегда отзывчиво, а пользователь не теряет данные даже при обрыве связи. Шиклинг подчеркивает, что это не просто технический трюк: это меняет мышление разработчика — вместо «как синхронизировать данные» думаешь «как гарантировать целостность событий».
Технические детали: сравнение с традиционным стеком
Традиционный трехзвенный стек подразумевает, что сервер управляет состоянием, а клиент — только представление. В локально-ориентированном подходе клиент берет на себя управление состоянием, а сервер становится просто синхронизатором. Это снижает нагрузку на сервер и упрощает масштабирование, но требует тщательной обработки конфликтов. Шиклинг отмечает, что SQLite на клиенте не предназначен для высоконагруженных сценариев, но для приложений с одним пользователем или малым числом одновременных изменений он идеален. Event sourcing добавляет накладные расходы на хранение журнала, но компенсируется отказоустойчивостью и возможностью «отката» к любому моменту.
Кого затронет и как: разработчики, стартапы, пользователи
Для разработчиков веб-приложений этот подход открывает новые возможности: меньше серверного кода, проще офлайн-режим, легче тестирование. Стартапы могут сэкономить на инфраструктуре, особенно на ранних этапах. Пользователи получат приложения, которые работают без интернета и не теряют данные. В российском контексте, где проблемы с доступом к облачным серверам не редкость, локально-ориентированные приложения особенно актуальны. Однако этот подход не универсален: для многопользовательских систем с высокой конкуренцией за данные (например, банковские транзакции) традиционная архитектура может оставаться предпочтительной.
Что будет дальше: от Overtone к индустрии
Шиклинг не планирует коммерциализировать Overtone, но видит потенциал для библиотек и фреймворков, упрощающих клиентский event sourcing. Он уже работает над инструментарием для SQLite-синхронизации. В индустрии наблюдается рост интереса к local-first приложениям — например, проекты вроде Replicache и Firebase тоже движутся в этом направлении. Ожидается, что к 2025 году больше разработчиков начнут экспериментировать с клиентским хранилищем, а SQLite может стать стандартом для офлайн-веб-приложений.
Итог
Отказ от трехзвенной архитектуры в пользу клиентского event sourcing — не просто модный тренд, а прагматичный ответ на потребности современных пользователей. Overtone показывает, что даже сложные музыкальные приложения могут работать полностью офлайн, сохраняя целостность данных. Разработчикам стоит присмотреться к этому подходу: он упрощает архитектуру, улучшает UX и снижает затраты на серверы.