Почему при использовании Notion API в качестве бэкенда падает скорость и теряются данные
Реалистичные ограничения баз данных Notion
У Notion удобный интерфейс. Именно поэтому разработчики-одиночки, у которых нет времени отдельно настраивать сервер и базу данных, выбирают Notion в качестве бэкенда. Однако если сохранить эту архитектуру на продакшн-уровне, вы быстро упретесь в стену. Notion API накладывает лимит в 3 запроса в секунду для каждого токена интеграции. При превышении этого лимита возвращаются ошибки 429 или 529.
Проблемы усугубляются даже при небольшом накоплении данных. Максимальное количество записей, которое можно получить за один раз, составляет 100 штук. Приходится самостоятельно реализовывать постраничную навигацию (пагинацию), а серверная логика усложняется из-за парсинга вложенных структур свойств. Размер данных свойств для одной страницы ограничен 2,5 мегабайтами. Если проигнорировать это ограничение и развернуть сервис, то при наплыве пользовательских запросов интерфейс начнет зависать, а данные — теряться.
Кэширование и плоская структура для снижения количества вызовов API
Нельзя каждый раз ждать ответа от внешнего API. Перед ним необходимо развернуть слой кэширования. Статические данные следует кэшировать в Redis или Cloudflare KV, а фоновые воркеры должны периодически их обновлять, чтобы обрабатывать локально до 80 процентов всех запросов к API. Время отклика при этом падает ниже 200 миллисекунд.
В бэкенде на Python также нужен парсер, который приводит сложные свойства Notion к плоскому виду. Ответы от Notion глубоко вложены в зависимости от типа. Создается парсер, который обходит словарь, проверяет поле типа, объединяет текст в строки, а из реляционных данных извлекает только массив идентификаторов. Только после прохождения этого этапа предобработки фронтенд-разработчики смогут использовать данные напрямую без какой-либо логики парсинга.
Ошибки синхронизации вебхуков и рутины восстановления данных
Даже если строка в Notion изменилась, обращение к API сразу после получения вебхука возвращает устаревшие данные. Это происходит из-за задержки индексации, которая является причиной потери пакетов или сбоев в данных.
Для решения этой проблемы необходима периодическая фоновая рутина восстановления. Используя фильтр по времени изменения в Notion API, можно сравнить локальный кэш с временными метками. В случае ошибки следует сделать паузу с использованием алгоритма экспоненциальной выдержки (exponential backoff) и повторить попытку. Чтобы не нарушать целостность данных, необходимо внедрить рутину, которая выбирает и принудительно обновляет только те записи, которые изменились после последней синхронизации.
Управление токенами и безопасность через бессерверные мидлвары
Код, отправляющий запросы с секретным ключом Notion напрямую из браузера клиента, опасен. Токен оказывается полностью раскрытым, к тому же возникают проблемы с CORS. Именно поэтому посередине необходимо установить бессерверный прокси-мидлвар.
Клиент отправляет запросы на бессерверный мидлвар, который добавляет токен, скрытый в переменных окружения сервера, и взаимодействует с Notion API. В условиях мультиарендной среды (multi-tenant) в мидлваре следует настроить обратную таблицу прав, сопоставляющую идентификаторы пользователей приложения и владельцев страниц Notion. Только такая архитектура позволяет предотвратить инциденты с утечкой токенов и безопасно изолировать данные.