Контент-бэкенд, который можно вырвать, не сломав сайт
Привязка к headless-CMS — это медленный налог, который вы платите вечно. Мы заложили шов: файлы сегодня, headless завтра и файловый фолбэк в день, когда база данных недоступна.
Выбор CMS раньше означал женитьбу на ней. Ваши шаблоны заучивают её причуды, ваша модель контента гнётся под её схему, а три года спустя «просто перейти» означает переписать всё заново. Мы спроектировали слой контента так, чтобы это решение оставалось обратимым.
Всё, что читает контент, проходит через единственный адаптер, не зависящий от провайдера и переключаемый одной переменной окружения: CMS_PROVIDER равен либо file, либо headless. В режиме file контент хранится в версионируемых исходниках — его можно сравнивать через diff, ревьюить, он деплоится вместе с кодом. В режиме headless тот же адаптер обращается к удалённому источнику и кеширует опубликованный снимок. Страницы над ним не знают и не интересуются, какой режим активен; они вызывают тот же интерфейс и получают ту же форму данных в ответ.
Чем мы гордимся больше всего — это поведение при сбое. Адаптер при каждом чтении сообщает свой источник — «live-remote», «snapshot-cache» или «file-fallback», — и когда удалённый источник недоступен, он переходит к запасному варианту, а не оставляет страницу пустой. Падение базы данных становится деградированным чтением, а не простоем. Посетители видят контент; мы видим залогированную причину перехода к запасному варианту. В этом и разница между инцидентом и не-событием.
От чего мы отказываемся: жёстко прописывать вызовы API конкретного вендора в компонентах страниц, позволять, чтобы моделирование контента диктовалось админ-интерфейсом CMS, или строить сайт, который возвращает ошибки в тот же миг, когда его бэкенд икнул. Мы также не делаем вид, будто этот шов бесплатен — у абстракции есть цена в виде дополнительного уровня косвенности. Мы платим её осознанно, потому что альтернатива — заплатить миграционный налог позже, с процентами.
Принцип: зависьте от шва, а не от вендора. Если ваш слой контента можно заменить переменной окружения и он переживает падение собственного бэкенда, контент принадлежит вам. Если же его замена означает переписывание, то вы принадлежите вендору. Мы предпочтём впитать немного косвенности сейчас, чем отдать кому-то другому право вето на нашу дорожную карту.