Архитектура ISP (OSS/BSS)
OMS (Order Management Service)
Saga-оркестратор заказов: подключение, смена тарифа, расторжение, ремонт.
OMS — Order Management Service
Bounded Context: Order Orchestration
Владелец данных: Order, OrderStep
Технологии: NestJS (Bun 1.3+), Drizzle ORM, PostgreSQL, ConnectRPC, RabbitMQ, BullMQ, Redis
Ответственность
OMS — центральный оркестратор всех бизнес-процессов, требующих координации нескольких сервисов. Реализует паттерн Saga (Orchestration). Аналог модулей Order Management в Hydra Billing и Scheduling в Splynx.
- Orders: Создание, отслеживание, приоритизация заказов. Полная трассировка каждого шага.
- Saga Engine: Последовательное выполнение шагов с компенсацией при ошибке. Каждый тип заказа = отдельный Saga Definition.
- Timeout Control: Мониторинг зависших шагов, автоматический retry или эскалация. Configurable per-step TTL.
- FSM Integration: Координация с Field Service Management (выезды монтажников, склад, мобильное приложение).
- Priority Queue: Заказы обрабатываются с учётом приоритета (
critical>high>medium>low). VIP-клиенты получают elevated priority.
Ключевые принципы OMS
| Принцип | Описание |
|---|---|
| Stateful Orchestrator | OMS хранит полное состояние заказа (текущий шаг, контекст, ретраи). При рестарте — продолжает с последнего шага |
| Command/Event driven | OMS отправляет команды в RabbitMQ и ждёт ответных событий. Не вызывает сервисы синхронно |
| Compensation = обратный порядок | При ошибке — компенсирующие команды в обратном порядке выполненных шагов |
| Idempotent steps | Каждый шаг Saga идемпотентен — повторная отправка команды не создаёт дублей |
| Observable | Каждый переход состояния = запись в audit + метрика. Дашборд показывает bottlenecks в реальном времени |
Агрегат: Order
Loading diagram...
Типы заказов
| Тип | Описание | Шаги Saga |
|---|---|---|
NEW_CONNECTION | Новое подключение | ReservePort → CreateSubscription → ChargeAccount → Provision → Complete |
TARIFF_CHANGE | Смена тарифа | ChangeSubscription → Recalculate → ChangeSpeed → Complete |
DISCONNECTION | Расторжение | TerminateSubscription → FinalCharge → Deactivate → ReleasePort → Complete |
REPAIR | Ремонт | CreateFSMTask → WaitCompletion → Verify → Complete |
EQUIPMENT_REPLACEMENT | Замена CPE | CreateFSMTask → Deactivate → Activate(new) → Complete |
SUSPENSION | Приостановка | SuspendSubscription → SuspendAccess → Complete |
RESUMPTION | Возобновление | ResumeSubscription → ResumeAccess → Complete |
Saga: New Connection (подробно)
Loading diagram...
Компенсация при ошибке (Provisioning FAIL):
Loading diagram...
ConnectRPC API
service OrderService {
rpc CreateOrder(CreateOrderRequest) returns (CreateOrderResponse);
rpc GetOrder(GetOrderRequest) returns (GetOrderResponse);
rpc ListOrders(ListOrdersRequest) returns (ListOrdersResponse);
rpc CancelOrder(CancelOrderRequest) returns (CancelOrderResponse);
rpc RetryOrder(RetryOrderRequest) returns (RetryOrderResponse);
}| Метод | RBAC | Описание |
|---|---|---|
CreateOrder | isp-operator+ | Создать заказ (idempotent) |
GetOrder | isp-viewer+ | Статус заказа + все шаги |
ListOrders | isp-viewer+ | Список заказов (фильтр по customer, status, type) |
CancelOrder | isp-operator+ | Отмена (если возможно на текущем шаге) |
RetryOrder | isp-admin+ | Повторить провалившийся заказ |
Входящие события (RabbitMQ)
OMS не публикует свои события, но потребляет события от других сервисов для продвижения Saga:
| Exchange | Routing Key | Queue | Описание |
|---|---|---|---|
customer.events | contract.signed | oms.q.contract-signed | Инициировать NEW_CONNECTION |
billing.events | payment.received | oms.q.payment-received | Проверка: ожидает ли Saga оплату |
provisioning.events | provisioning.success | oms.q.provisioning-result | Saga: шаг завершён |
provisioning.events | provisioning.failed | oms.q.provisioning-result | Saga: шаг провален → компенсация |
fsm.events | work.completed | oms.q.fsm-result | FSM: монтаж завершён |
fsm.events | work.failed | oms.q.fsm-result | FSM: монтаж провален |
Исходящие команды (RabbitMQ)
| Exchange | Routing Key | Описание |
|---|---|---|
provisioning.commands | service.activate | Активация на оборудовании |
provisioning.commands | service.deactivate | Деактивация |
billing.commands | charge.account | Списание (шаг Saga) |
billing.commands | refund | Возврат (компенсация) |
notification.commands | send.sms | Уведомление клиента |
Background Jobs (BullMQ)
| Job | Расписание | Описание |
|---|---|---|
oms.timeout_check | Каждые 5 мин | Проверка зависших шагов (> SLA timeout) |
oms.escalation | Каждые 15 мин | Эскалация просроченных заказов |
oms.cleanup | Ежедневно, 05:00 | Архивация завершённых заказов (> 90 дней) |
Ссылки:
- Protobuf-контракт: orchestration/v1/order_service.proto
- Saga-паттерн: API-контракты / Saga
- Workflow'ы (Lead-to-Cash и др.): Workflows