---
type: architecture-decision
title: Геораспределённый биллинг на Temporal SAGA
domain: fintech
services: [backend-platform]
skills: [Temporal, SAGA / Распределённые транзакции, Идемпотентность, Event-Driven Architecture, System Design]
technologies: [Go, Temporal, gRPC, Kafka, NATS, PostgreSQL]
problem: Распределённой платёжно-биллинговой платформе нужно было обрабатывать денежные депозиты по регионам с гарантией exactly-once — переживая отказ региона, сетевые разрывы и дубли колбэков провайдеров — без хрупкого самодельного координатора и без two-phase commit.
approach: Смоделировал депозит как Temporal SAGA — шестишаговый workflow с LIFO-компенсациями. Операции с кошельком выполняются в регионе, оркестрация остаётся в core; запросы роутятся по региону через task queues и gRPC fire-and-forget, а транспорт core↔region спроектирован и сравнён в двух вариантах — региональный Temporal-воркер по WAN и NATS request/reply. У каждой activity свой ключ идемпотентности, FX-курс фиксируется на первом исполнении и реплеится из event history на ретраях, а колбэки провайдеров приходят через Kafka — доставка переживает даунтайм Temporal.
result: Межрегиональные депозиты, эффективно ровно один раз — сбойный шаг запускает компенсации, зависший workflow ограничен таймаутом, дубли колбэков дедупятся по workflow ID, а недоступный регион деградирует безопасно с алертами, не теряя и не задваивая деньги.
evidence: Описано в истории работы (Korvax, 2022–настоящее время). Трейд-оффы дизайна — сравнение транспортов core↔region, семантика компенсаций и матрица отказов — разбираемы в звонке.
public_links: []
available_for: приватный разбор
language: ru
canonical: https://asmanmalikov.com/ru/proof/temporal-saga-billing/
---

# Геораспределённый биллинг на Temporal SAGA

- **Problem:** Распределённой платёжно-биллинговой платформе нужно было обрабатывать денежные депозиты по регионам с гарантией exactly-once — переживая отказ региона, сетевые разрывы и дубли колбэков провайдеров — без хрупкого самодельного координатора и без two-phase commit.
- **Approach:** Смоделировал депозит как Temporal SAGA — шестишаговый workflow с LIFO-компенсациями. Операции с кошельком выполняются в регионе, оркестрация остаётся в core; запросы роутятся по региону через task queues и gRPC fire-and-forget, а транспорт core↔region спроектирован и сравнён в двух вариантах — региональный Temporal-воркер по WAN и NATS request/reply. У каждой activity свой ключ идемпотентности, FX-курс фиксируется на первом исполнении и реплеится из event history на ретраях, а колбэки провайдеров приходят через Kafka — доставка переживает даунтайм Temporal.
- **Result:** Межрегиональные депозиты, эффективно ровно один раз — сбойный шаг запускает компенсации, зависший workflow ограничен таймаутом, дубли колбэков дедупятся по workflow ID, а недоступный регион деградирует безопасно с алертами, не теряя и не задваивая деньги.
- **Evidence:** Описано в истории работы (Korvax, 2022–настоящее время). Трейд-оффы дизайна — сравнение транспортов core↔region, семантика компенсаций и матрица отказов — разбираемы в звонке.
