Что такое Temporal и для чего он используется?

Ответ

Temporal — это open-source платформа для оркестрации распределённых, отказоустойчивых и долгоживущих процессов, которые называются воркфлоу (workflows).

Простыми словами, Temporal позволяет писать сложную бизнес-логику (например, процесс оформления заказа в интернет-магазине) как единый последовательный код, а платформа сама заботится о сохранении состояния, повторных попытках (retries), таймаутах и восстановлении после сбоев.

Ключевые компоненты

  1. Workflow: Код, описывающий бизнес-логику. Он детерминирован и может «жить» очень долго (дни, месяцы). Его состояние надёжно сохраняется.
  2. Activity: Код, выполняющий реальную работу (например, вызов внешнего API, запись в базу данных, отправка email). В отличие от Workflow, Activity может иметь побочные эффекты и не является детерминированным.
  3. 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-паттерн в микросервисах.