Ответ
Temporal — это open-source платформа для оркестрации распределённых, отказоустойчивых и долгоживущих процессов, которые называются воркфлоу (workflows).
Простыми словами, Temporal позволяет писать сложную бизнес-логику (например, процесс оформления заказа в интернет-магазине) как единый последовательный код, а платформа сама заботится о сохранении состояния, повторных попытках (retries), таймаутах и восстановлении после сбоев.
Ключевые компоненты
- Workflow: Код, описывающий бизнес-логику. Он детерминирован и может «жить» очень долго (дни, месяцы). Его состояние надёжно сохраняется.
- Activity: Код, выполняющий реальную работу (например, вызов внешнего API, запись в базу данных, отправка email). В отличие от Workflow, Activity может иметь побочные эффекты и не является детерминированным.
- Worker: Процесс, который хостит и выполняет код Workflow и Activity, опрашивая сервер Temporal на предмет новых задач.
Основные преимущества
- Надёжность: Воркфлоу переживают сбои воркеров, серверов и сети. Temporal гарантирует, что воркфлоу будет выполнен до конца.
- Видимость (Visibility): Предоставляет инструменты для отслеживания состояния, истории и отладки каждого экземпляра воркфлоу.
- Масштабируемость: Архитектура позволяет горизонтально масштабировать воркеры для обработки большой нагрузки.
Пример использования в Go
// Workflow определяет последовательность шагов
func OrderProcessingWorkflow(ctx workflow.Context, orderID string) (string, error) {
// Настраиваем таймауты для Activity
ao := workflow.ActivityOptions{
StartToCloseTimeout: 10 * time.Second,
}
ctx = workflow.WithActivityOptions(ctx, ao)
// 1. Списать деньги
var chargeResult string
err := workflow.ExecuteActivity(ctx, ChargeCustomerActivity, orderID).Get(ctx, &chargeResult)
if err != nil {
return "", err
}
// 2. Отправить заказ на склад
err = workflow.ExecuteActivity(ctx, ShipOrderActivity, orderID).Get(ctx, nil)
if err != nil {
return "", err
}
return "Order completed", nil
}
// Activity выполняет реальную работу
func ChargeCustomerActivity(ctx context.Context, orderID string) (string, error) {
// ... логика обращения к платёжному шлюзу ...
return "charged", nil
}
Temporal идеально подходит для сложных бизнес-процессов, где важна гарантия выполнения: обработка заказов, онбординг пользователей, ETL-пайплайны, SAGA-паттерн в микросервисах.