Мозаика вместо
центрального региона
312 одинаковых плиток по всему миру. В каждой — полный рантайм, локальный KV, кеш и собственный TLS-терминатор. Нет «главной» точки, падение которой уносит остальные.
19 миллисекунд от кнопки до ответа
Ниже — реальная разбивка p50 для запроса из Москвы. Ни одного прыжка в центральный дата-центр.
Пользователь
Браузер, приложение, вебхук
0 мсAnycast
Точка выбирается по сети, а не по геобазе
+9 мсИзолят V8
Холодный старт 3 мс, ваш handler
+6 мсKV на месте
Чтение из локальной реплики
+0.4 мсОтвет
Сжатие и отдача из той же точки
19 мсЧто доступно внутри функции
Стандартные Web API плюс тонкий слой платформенных биндингов в env. Ничего проприетарного учить не надо: если код работает в браузере или в Deno — почти наверняка заработает и здесь.
Полный справочник API →01 Web API и стандарты
fetch, Request, Response, Headers, URL, URLPattern, FormData, TextEncoder, WebCrypto, structuredClone, таймеры, AbortController.
нет: файловой системы, сырых TCP-сокетов, дочерних процессов
02 Хранилища
KV — ключ-значение с репликацией на все точки, чтение 0,4 мс, запись сходится за ~2 с. Blob — объекты до 5 ГБ с отдачей через ту же сеть. Counters — атомарные счётчики для лимитов и квот.
03 Cron и отложенные задачи
Экспортируйте scheduled и опишите расписание в tessera.json. Задача выполняется ровно один раз в одной точке, лидер выбирается автоматически.
{ "cron": [{ "expr": "*/5 * * * *", "handler": "scheduled" }] }04 Секреты и окружения
Секрет шифруется на клиенте и расшифровывается только внутри изолята. В логах, дампах и трассировках значение заменяется на [secret]. Отдельные наборы для preview и prod.
05 Стримы и SSE
Можно отдать ReadableStream и начать отвечать до того, как готов весь payload. Держать соединение разрешено до 15 минут — этого хватает и на SSE, и на прокси к LLM.
06 Наблюдаемость
Структурные логи, трейсы в формате OpenTelemetry, метрики по точкам присутствия. Хвост логов — tessera logs --tail --pop dme1.
Честно про компромиссы
Изоляты быстрее и дешевле, но не универсальны. Вот где Tessera выигрывает, а где — нет.
| Параметр | Tessera | Контейнеры в k8s | Serverless в одном регионе |
|---|---|---|---|
| Холодный старт | 3 мс | 200–900 мс | 120–450 мс |
| География | 312 точек по умолчанию | сколько кластеров развернёте | один регион |
| Единица оплаты | мс исполнения | время работы нод | ГБ·с, округление до 100 мс |
| Простой | 0 ₽ | полная стоимость нод | 0 ₽ |
| Языки | JS, TS, WASM | любые | 7–10 рантаймов |
| Долгие задачи | до 15 мин на запрос | без ограничений | 15 мин |
| Нативные зависимости | только WASM | любые | слои и образы |
| Время до продакшена | 8 секунд | недели | часы |
↑ если вам нужен ffmpeg, тяжёлый ML или постоянное соединение с базой — берите контейнеры, тут мы не спорим
Соседи по плитке вас не видят
Один процесс держит тысячи изолятов, поэтому границы проведены жёстко и на нескольких уровнях.
Память по контексту
У каждого изолята своя куча и свой лимит. Выйти за границу нельзя даже при попытке — движок снимает изолят, а не процесс.
Спектральная защита
Точный таймер загрублён, разделяемая память отключена, соседи по ядру перемешиваются каждые несколько секунд.
Подписанные артефакты
Бандл подписывается при сборке, точка присутствия отказывается запускать код без валидной подписи. История версий — 90 дней с откатом одной командой.
Все ограничения на одном экране
Без мелкого шрифта и без «свяжитесь с отделом продаж, чтобы узнать цифру».
| Размер бандла | 10 МБ |
| Память на изолят | 128 МБ |
| CPU на запрос | 50 мс |
| Время ответа | 15 мин |
| Подзапросов fetch | 50 |
| Переменных окружения | 128 |
| Размер значения KV | 25 МБ |
| Записей KV в секунду на ключ | 1 |
| Объект Blob | 5 ГБ |
| Тело запроса | 100 МБ |
| Заголовков в ответе | 64 |
| Cron-задач на проект | 20 |
Проверьте на своём коде
В песочнице работает настоящий раннер: пишете handler, жмёте «Запустить» и видите ответ, логи и разбивку по времени.