Bun + Temporal API: надежные scheduler-приложения на TypeScript в 2026
-

Хочешь строить scheduler-приложения, которые не падают от сбоев? Bun с Temporal API - это комбо для TypeScript-проектов, где задачи выполняются надежно, даже если сервак перезагружается. Разберем, как их интегрировать шаг за шагом.
Temporal API наконец-то в ES2026 - никаких больше мук с Date, который путает часовые пояса и летние переходы. А Bun уже экспериментально тянет эту фичу через JSC-флаг. Получится scheduler, который планирует задачи, retry-ит фейлы и держит состояние вечно.
Почему Bun и Temporal - идеал для scheduler’ов
Bun - это молниеносный рантайм на JavaScriptCore, который в 2026 уже обгоняет Node по скорости. Temporal API добавляет точную работу с датами: PlainDate, ZonedDateTime, Instant - все immutable и без багов. Вместе они решают типичные боли scheduler’ов: дедлайны в разных таймзонах, retry при сбоях, распределенные задачи.
Представь: бот отправляет рассылки по расписанию. Без Temporal Date сломается на DST, без оркестрации типа Temporal задачи потеряются при рестарте. Bun дает скорость, Temporal - надежность. Тесты показывают: с флагом BUN_JSC_useTemporal тесты Temporal летают за 0.8с, против 228с на полифиллах.
- Скорость: Bun запускает scheduler в разы быстрее Node, особенно с Temporal.
- Надежность: Workflows Temporal держат состояние, детерминированы.
- TypeScript-friendly: Полная типизация из коробки в Bun и Temporal SDK.
- Экспериментальная фича: Включи
BUN_JSC_useTemporal=1- и Temporal работает нативно.
Сравнение рантаймов для Temporal Рантайм Pass Rate Время тестов Примечание --------- ----------- -------------- ------------ Bun (JSC) 40% 0.8с Блитц-скорость temporal-polyfill 88% 6с Медленнее @js-temporal/polyfill 84% 228с Тормозит Установка и базовый сетап в Bun
Сначала ставим Bun -
curl -fsSL https://bun.sh/install | bash. Temporal SDK для TypeScript тянется черезbun add @temporalio/client @temporalio/worker. Не забудь флаг для Temporal API: экспортируйBUN_JSC_useTemporal=1в .env или терминале. Это включает нативную поддержку в JSC, без полифиллов.Запускаем Temporal сервер локально - docker compose из их доков. В TypeScript пишем workflow: функция, которая детерминировано планирует задачи. Activity - реальная логика, типа отправки email. Bun компилит TS в runtime быстрее всех, так что dev-сервер летает.
Вот базовый пример scheduler’а для ежедневных задач:
import { defineWorkflow, defineActivity } from '@temporalio/workflow'; const sendReport = defineActivity({ async fn(date: Temporal.PlainDate) { // Логика отправки console.log(`Report for ${date.toString()}`); } }); export const dailyScheduler = defineWorkflow({ async fn(start: string) { const startDate = Temporal.PlainDate.from(start); while (true) { await sendReport(startDate); startDate.add({ days: 1 }); await proxyActivities.sleep('1d'); } } });- Workflow: Детерминированная логика, Temporal сам retry-ит.
- Нюанс: Используй
proxyActivitiesдля таймаутов - не свои setTimeout. - Activity: Stateful код, прокидывай Temporal.PlainDate для дат.
- Запуск:
bun run workflow.tsс worker’ом.
Интеграция с реальным проектом: пример scheduler’а
Допустим, строим API для тасков с дедлайнами. Bun-сервер на
Bun.serve, Temporal worker в фоне. Клиент SDK стартует workflow сTemporal.ZonedDateTime. При сбое сервера Temporal Cloud или self-hosted кластер подхватит выполнение - zero downtime.В Docker: multi-stage build с oven/bun:1-alpine. Проблема с protobufjs в alpine фиксится патчем или сменой на non-alpine. В 2026 Bun уже дошлифовал совместимость с Temporal client - коннект в контейнере без танцев.
// bunfig.toml [env] BUN_JSC_useTemporal = "1" // server.ts import { Connection } from '@temporalio/client'; const connection = await Connection.connect();Компоненты стека Роль Bun Runtime + сервер Temporal SDK Workflows/Activities Temporal.PlainDate Даты без багов TypeScript 6.0 Нативная поддержка Temporal - Масштаб: Worker’ы горизонтально, Temporal балансирует.
- Внимание: Детерминизм - никаких random, Date.now() в workflows.
- Мониторинг: Веб-UI Temporal показывает все executions.
Продвинутые фичи: cron, retries и signals
Temporal workflows тянут cron-стиль:
schedule(cron('0 9 * * *')). С Temporal API cron вычисляется точно, с учетом зон. Retries настраиваются в activity options: backoff, max attempts. Signals позволяют менять workflow на лету - отменить задачу из API.Пример с retry и signal:
const options = { retry: { maximumAttempts: 5, backoffCoefficient: 2 } }; await proxyActivities(sendReport, options)(date);- Cron: Интеграция с Temporal scheduler API.
- Signals/Queries: Изменяй состояние живого workflow.
- Хак: Для сложных дат комбинируй Instant + ZonedDateTime.
Scheduler в продакшене: что реально работает
В 2026 Bun с Temporal - стандарт для надежных таскеров на TS. Масштабируй на кластер, добавь Nexus для cross-namespace. Остается докрутить интеграцию с date pickers - стандарт пока не доделан, но полифиллы рулят. Подумай над tracing через OpenTelemetry для дебагов в проде.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.