INTEGRITY Документация

Как работает Hyperdrive

Подключение к традиционным централизованным базам данных из глобальной сети Cloudflare, которая насчитывает более 300 локаций дата-центров ↗ создаёт ряд сложностей, поскольку запросы могут поступать из любого из этих мест.

Если ваша база данных расположена централизованно, запросам может требоваться много времени, чтобы дойти до нее и обратно. Еще больше времени уходит в ситуациях, когда приходится устанавливать новые подключения из stateless-сред вроде Workers, что требует нескольких round-trip на каждый вызов Worker.

Традиционные базы данных обычно поддерживают ограниченное максимальное число подключений. При достаточно большом объёме распределённого трафика эти подключения легко исчерпать.

Hyperdrive решает эти проблемы, управляя количеством глобальных подключений к исходной базе данных: он выборочно анализирует запросы и определяет, какие ответы кешировать, тем самым снижая нагрузку на базу данных и ускоряя выполнение запросов.

Как Hyperdrive ускоряет работу с базами данных по всему миру

Hyperdrive ускоряет запросы к базе данных за счёт:

Это обеспечивает оптимальную производительность при подключении к базе данных из Workers независимо от того, кешируются ли ваши запросы.

соединение Hyperdrive

1. Настройка периферийного подключения

Когда драйвер базы данных подключается к базе данных из Cloudflare Worker напрямую, оно сначала пройдет через установку подключения. Это может потребовать нескольких обменов данными с базой данных для проверки и установления безопасного подключения. Это может привести к дополнительной сетевой задержке из-за расстояния между вашим Cloudflare Worker и базой данных.

С Hyperdrive, эта установка подключения происходит между вашим Cloudflare Worker и Hyperdrive на edge-сервере, максимально близко к вашему Worker (см. диаграмму, метка 1. Настройка подключения). Это дает значительно меньшую задержку, поскольку установка подключения завершается в пределах одной локации.

Подробнее о том, как устроены соединения между Workers и Hyperdrive, см. в Жизненный цикл соединения.

2. Пул подключений

Hyperdrive создаёт пул соединений с вашей базой данных, которые можно повторно использовать при выполнении приложением запросов к базе данных.

Пул соединений с базой данных размещается в одном или нескольких регионах, ближайших к исходной базе данных. Это сводит к минимуму задержку, возникающую при обмене данными между Cloudflare Workers и базой данных при установке новых соединений, а также минимизирует сетевую задержку для некешированных запросов.

Если в пуле подключений уже есть существующие подключения, пул попытается повторно использовать одно из них (см. диаграмму, метка 2. Существующее прогретое подключение). Если в пуле подключений нет уже существующих подключений, он установит новое подключение к вашей базе данных и использует его для маршрутизации запроса. Это позволяет использовать и создавать минимально необходимое для работы приложения число подключений.

Подробнее о поведении и настройке пула соединений см. в Пул подключений.

3. Кэширование запросов

Hyperdrive поддерживает кеширование неизменяющих (read) запросов к базе данных.

Когда запросы отправляются через Hyperdrive, он разбирает запрос и определяет, является ли запрос мутирующим (запись) или немутирующим (чтение).

Для немутирующих запросов Hyperdrive кеширует ответ в течение настроенного max_age. Когда ваш Worker позже отправляет запрос, совпадающий с исходным, Hyperdrive возвращает ответ из кэша вместо повторной отправки запроса в исходную базу данных.

Кеширование снижает нагрузку на исходную базу данных и ускоряет время отклика на ваши запросы.

Hyperdrive не сбрасывает кэш результатов запросов на чтение при записи вашим приложением в базу данных. Если вашему приложению требуется согласованность чтения после записи, см. Кеширование запросов с рекомендациями о том, как использовать отдельную конфигурацию Hyperdrive с отключенным кэшированием для запросов, которые должны возвращать только актуальные данные.

Подробнее о поведении и настройке кеширования запросов см. в Кеширование запросов.

Режим пула подключений

Пул соединений Hyperdrive работает в режиме транзакций: клиент, выполняющий запрос, использует одно соединение на протяжении всей транзакции. По завершении транзакции соединение возвращается в пул.

Hyperdrive поддерживает SET инструкции ↗ на время транзакции или запроса. Например, если вы вручную создаете транзакцию с помощью BEGIN/COMMIT, SET инструкции внутри транзакции вступят в силу. Кроме того, запрос, содержащий SET команда (SET X; SELECT foo FROM bar;) также применит SET команда. Когда соединение возвращается в пул, оно RESET так, чтобы SET команды не будут применяться к последующим запросам.

Это означает, что в рамках одного вызова Worker может быть открыто несколько подключений для операций с базой данных и может потребоваться SET никаких конфигураций для каждого запроса или транзакции. Не рекомендуется оборачивать несколько операций с базой данных в одну транзакцию, чтобы сохранить SET состоянии. Это повлияет на производительность и масштабирование Hyperdrive, поскольку на время транзакции соединение не может быть повторно использовано другими изолятами Worker.

Hyperdrive поддерживает именованные подготовленные выражения (prepared statements), реализованные в postgres.js и node-postgres драйверов. В других драйверах именованные подготовленные выражения могут работать медленнее или не поддерживаться вовсе.