Архитектура и интеграции
Интеграционный контур B2B-заказов и ERP
Контур фиксирует владельцев данных, транзакционные границы и восстановление после неоднозначного ответа ERP.
Архитектурное решение соединяет API, outbox, Kafka, ERP, observability и ручной recovery в проверяемый процесс.
Архитектура и интеграции
Что сделали и как приняли решение
- Контур
- 6 связанных узлов
- Delivery
- At-least-once
- Граница
- Order, key и outbox в одной транзакции
- Повтор
- Идемпотентный side effect
- Неясный итог
- Сначала reconciliation
- Релиз
- После проверки критериев приемки
Архитектурное решение
Сначала фиксируем заказ и outbox, потом публикуем событие
Order, idempotency key и outbox сохраняются атомарно. Внешняя доставка допускает повторы, а timeout сначала проходит reconciliation.
Сквозной контур
- 01
B2B-клиент
Отправляет заказ со стабильным ключом.
- 02
Order API
Проверяет tenant scope и принимает команду.
- 03
PostgreSQL + outbox
Атомарно сохраняет заказ, ключ и событие.
- 04
Kafka
Доставляет событие минимум один раз.
- 05
ERP adapter
Сверяет состояние и выполняет side effect.
- 06
Control plane
Собирает метрики, alerts и recovery.
Data ownership
Для каждого состояния указан владелец
Order API владеет локальным статусом, ERP своей записью, а reconciliation связывает два состояния.
- Tenant scope проверяется на сервере
- Correlation ID проходит через весь поток
- История переходов доступна для аудита
Failure path и observability
Timeout не приводит к слепому повтору
Adapter проверяет состояние ERP, а метрики, alerts и runbook ведут команду к конкретному recovery-действию.
- Retry ограничен по попыткам и времени
- Poison message уходит в управляемый recovery
- Ручное действие защищено idempotency key
Проверяемые данные
Инварианты контура
| Инвариант | Механизм | Проверка |
|---|---|---|
| Один запрос не создает два заказа | Idempotency key | Повтор с тем же ключом |
| Событие не теряется после commit | Transactional outbox | Сбой publisher после commit |
| Tenant не видит чужие данные | Server-side scope | Cross-tenant negative test |
| Нет слепого повтора после timeout | Reconciliation | Timeout после ERP side effect |
Проверяемые данные
Критерии приемки
| Область | Критерий | Проверка |
|---|---|---|
| Контракт | API и event schema согласованы | Контрактные тесты |
| Надежность | Outage проходит без дублей | Проверка сценария сбоя |
| Безопасность | Tenant isolation подтверждена | Негативные тесты |
| Эксплуатация | Alerts и recovery проверены | Проверка инструкции восстановления |