Temporal: длительные процессы и восстановление после сбоев
Проект «Согласование» резервирует место для материала, ждёт решения редактора и публикует либо освобождает бронь. Temporal хранит историю процесса, а собственный учебный HTTP gateway хранит внешние эффекты и квитанции. Эта граница помогает понять, что устойчивый Workflow не отменяет требований к идемпотентности внешнего сервиса.
Нужны TypeScript, async/await, HTTP и основы командной строки. Используем локальный Temporal dev-server, Node.js 24 и SDK 1.24.0. В проекте нет реальной отправки писем или публикации рабочего сайта. Workflow-стадии полные; README объясняет, какие истории допускаются при переключении версии.
| Урок | Результат |
|---|---|
| 1. Длительный процесс как Workflow | Выбрать идентичность и границы процесса, отличив его от одной job. |
| 2. Минимальный каркас | Связать Workflow, Activity, Worker, Client и собственный gateway. |
| 3. Task Queue и Worker | Понять получение задач и корректное завершение исполнителя. |
| 4. Устойчивый таймер | Сохранить ожидание между перезапусками Worker. |
| 5. Signal, Query и срок решения | Передать решение редактора и наблюдать состояние. |
| 6. Retries, timeouts и heartbeat | Ограничить попытки и различить сетевой сбой и предметный конфликт. |
| 7. Идемпотентная Activity | Получить прежнюю квитанцию после потерянного ответа. |
| 8. Отмена Workflow | Связать cancel, HTTP AbortSignal и cleanup. |
| 9. Компенсация и ручное решение | Освободить возможную бронь и выразить неподтверждённый исход. |
| 10. History и replay | Отделить воспроизведение решений от новых внешних действий. |
| 11. Patched и versioning | Добавить validation с совместимым переходом от стадии 09. |
| 12. Передача процесса | Описать состояние, ручную сверку и границу Continue-As-New. |
Скачать полные исходники. Архив содержит семь полных вариантов Workflow и общие Worker, Client, Activities, gateway, README и регламент передачи.
Серия опубликована. Зависимости не устанавливались, TypeScript не собирался, программы, серверы, Activities, cancellation, compensation и replay не запускались. Тесты и публикация учебных приложений не проводились. JSON history не включена, поскольку исполнений не было; все результаты ожидаемые.
Учебный gateway работает одним процессом и не является производственной базой. Release освобождает бронь, но не отзывает уже опубликованный материал. Эти границы сохраняются в каждом соответствующем этапе и документации примера.