Перейти к содержимому
обзор / платформа

Мозаика вместо
центрального региона

312 одинаковых плиток по всему миру. В каждой — полный рантайм, локальный KV, кеш и собственный TLS-терминатор. Нет «главной» точки, падение которой уносит остальные.

путь запроса

19 миллисекунд от кнопки до ответа

Ниже — реальная разбивка p50 для запроса из Москвы. Ни одного прыжка в центральный дата-центр.

Пользователь

Браузер, приложение, вебхук

0 мс

Anycast

Точка выбирается по сети, а не по геобазе

+9 мс

Изолят V8

Холодный старт 3 мс, ваш handler

+6 мс

KV на месте

Чтение из локальной реплики

+0.4 мс

Ответ

Сжатие и отдача из той же точки

19 мс
Почему без прыжка в центр Состояние, которое нужно запросу, лежит рядом: KV реплицируется на все точки, а изолят не хранит ничего между вызовами. Централизованная база нужна только там, где важна строгая консистентность — и тогда вы вызываете её явно.
рантайм

Что доступно внутри функции

Стандартные 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 мин
Подзапросов fetch50
Переменных окружения128
данные и сеть
Размер значения KV25 МБ
Записей KV в секунду на ключ1
Объект Blob5 ГБ
Тело запроса100 МБ
Заголовков в ответе64
Cron-задач на проект20
Про 50 мс CPU Это процессорное время, а не общее. Ожидание fetch и KV в него не входит — поэтому запрос, который 400 мс ждёт внешний API, всё ещё укладывается в лимит.

Проверьте на своём коде

В песочнице работает настоящий раннер: пишете handler, жмёте «Запустить» и видите ответ, логи и разбивку по времени.