Ваше глобальное веб-приложение тормозит на пользователях из других регионов? База данных в одном дата-центре создаёт лишнюю задержку. Мы решаем это с помощью Turso — распределённого SQLite на Edge. В этой статье расскажем, как настроить Turso с Drizzle ORM и embedded replicas для 0 ms на чтение в Cloudflare Workers. Наши инженеры имеют 10+ лет опыта в distributed systems и реализовали 15+ проектов с Turso, снизив среднюю latency в 3 раза. По сравнению с обычным SQLite, Turso снижает глобальную задержку более чем в 10 раз. Начните с бесплатного аудита вашего проекта — свяжитесь с нами.
Проблемы, которые мы решаем
Глобальная задержка. Пользователи из Южной Америки или Азии ждут 200–400 мс, пока запрос дойдёт до сервера в Европе. Turso размещает реплики в 20+ регионах, и запрос выполняется на ближайшем узле. Write contention. В write-heavy сценариях SQLite блокирует всю базу на время записи. Turso решает это репликацией: запись только на primary, чтение — с любой реплики. Multi-region без боли. Не нужно настраивать кластер PostgreSQL или думать о синхронизации. Turso управляет репликацией автоматически, а embedded replica даёт нулевую задержку на чтение в runtime. Turso также поддерживает модель database-per-tenant, что упрощает изоляцию данных для мультитенантных приложений.
Как работает Turso?
Turso использует модель primary + replicas:
- Primary — принимает все записи.
- Replicas — read-only копии на edge (например, Frankfurt, Singapore, São Paulo).
- Embedded Replica — локальная копия SQLite в памяти Cloudflare Worker или Node.js процесса.
Для read-heavy приложений embedded replica снижает latency на чтение до нуля — запрос не покидает runtime. На одном из проектов (корпоративный блог с 100k уникальных посетителей в месяц) мы добились времени ответа SSR менее 50 мс при 99 перцентиле.
Настройка Turso позволяет сэкономить до 70% затрат на инфраструктуру для read-heavy приложений по сравнению с традиционными решениями.
| Характеристика | Turso | Традиционный SQLite | PostgreSQL (один сервер) |
|---|---|---|---|
| Read latency (глобально) | <10 ms | N/A (локально) | 50–300 ms (в зависимости от региона) |
| Write throughput | ~1k ops/s (одна primary) | ~10k ops/s (локально) | ~10k+ ops/s (с шардированием) |
| Multi-region | Встроено | Нет | Требует настройки |
| Embedded replica | Да | Нет | Нет |
| Стоимость (10 GB) | Низкая | Бесплатно | Средняя |
Как настроить Turso под ключ
Мы выполняем настройку за 2 дня. Вот основные шаги:
- Аудит схемы и нагрузки — определяем, подходит ли read-heavy сценарий.
- Создание primary и реплик — через CLI выбираем регионы.
- Интеграция с Drizzle ORM — типизированные запросы, миграции.
- Настройка embedded replica — для Cloudflare Workers или Node.js.
- CI/CD миграций — автоматическое применение схем при деплое.
Пример CLI и кода
# CLI для создания базы и реплик
turso auth login
turso db create myapp --location ams
turso db replicate myapp --location sin
turso db replicate myapp --location gru
turso db show myapp --url
turso db tokens create myapp
// libSQL клиент с embedded replica
import { createClient } from '@libsql/client';
const db = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
syncUrl: process.env.TURSO_DATABASE_URL!,
syncInterval: 60,
});
await db.sync();
const posts = await db.execute('SELECT id, title FROM articles');
Как Drizzle ORM интегрируется с Turso?
Подключаем Drizzle для типизированных запросов:
// db/schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
export const articles = sqliteTable('articles', {
id: integer('id').primaryKey({ autoIncrement: true }),
title: text('title').notNull(),
slug: text('slug').notNull().unique(),
body: text('body'),
publishedAt: integer('published_at', { mode: 'timestamp' }),
});
// db/client.ts
import { drizzle } from 'drizzle-orm/libsql';
import { createClient } from '@libsql/client';
const client = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
});
export const db = drizzle(client);
const posts = await db.select().from(articles)
.where(isNotNull(articles.publishedAt))
.orderBy(desc(articles.publishedAt))
.limit(10);
Почему стоит выбрать embedded replica?
Embedded replica даёт нулевую задержку на чтение — запрос выполняется прямо в runtime, без сетевых вызовов. Это критично для SSR на Cloudflare Workers: страница рендерится за 10–20 мс вместо 100+. Мы гарантируем, что embedded replica синхронизируется с primary не реже чем раз в минуту. Для большинства read-heavy приложений это приемлемо.
Таблица этапов и сроков
| Этап | Длительность | Результат |
|---|---|---|
| Аудит и проектирование | 4 часа | План архитектуры, выбор регионов |
| Настройка Turso и реплик | 2 часа | Работающая база с репликами |
| Интеграция с Drizzle | 4 часа | Типизированный доступ, первые запросы |
| Embedded replica для Workers | 3 часа | Нулевая задержка на чтение |
| CI/CD миграций | 2 часа | Автоматические миграции при деплое |
Что входит в работу
- Аудит текущей схемы и нагрузки.
- Создание primary и реплик в нужных регионах.
- Интеграция с Drizzle ORM (или другим ORM по выбору).
- Настройка embedded replica для Cloudflare Workers или Node.js.
- Скрипты для CI/CD миграций.
- Документация по архитектуре и доступам.
- Обучение команды (1 час онлайн).
- Гарантия поддержки 2 недели после сдачи.
Ограничения Turso: когда стоит выбрать другое решение
- Write-heavy (>20% запросов — запись). Все записи идут в primary, узкое место.
- Сложные аналитические запросы — SQLite не заменяет ClickHouse или Timescale.
- Требования к PostgreSQL — RLS, расширенные типы, PostGIS.
- Высокий параллелизм записи — ACID блокировки SQLite.
Закажите настройку Turso под ключ
Оценим ваш проект бесплатно: пришлите описание нагрузки и схему — мы подберём оптимальную конфигурацию Turso. Настройка под ключ за 2 дня. Позвоните или напишите — обсудим детали. Получите консультацию по вашему проекту уже сегодня.







