Архитектура ISP (OSS/BSS)
Product & Subscription Service
Каталог тарифов, подписки, жизненный цикл услуг и ценообразование.
Product & Subscription Service
Bounded Context: Product Catalog & Subscription Lifecycle
Владелец данных: ProductOffering, Subscription, Characteristic, PriceRule
Технологии: NestJS (Bun 1.3+), Drizzle ORM, PostgreSQL, ConnectRPC, RabbitMQ, BullMQ
Ответственность
Product & Subscription — сердце коммерческой модели ISP. Определяет, что мы продаём и на каких условиях. Аналог модулей Tariff Plans + Services в Splynx и Product Catalog в Hydra Billing.
- Product Catalog: Управление тарифными планами, характеристиками, ценообразованием, зонами доступности. Поддержка бандлов (Internet + IPTV + VoIP).
- Subscription Lifecycle: Полный жизненный цикл услуги клиента: создание → активация → приостановка → расторжение. Каждый переход — доменное событие.
- Pricing Engine: Скидки, промо-акции, loyalty-программы, volume discounts, индивидуальные условия.
- Bundling: Комбинированные предложения с общей скидкой и зависимым жизненным циклом (отключение основной услуги → каскадное отключение доп. услуг).
Модели тарификации
| Модель | Описание | Пример | Биллинг-интеграция |
|---|---|---|---|
| Flat-rate (recurring) | Фиксированная абонплата | Internet 100 Мбит/с — 500₽/мес | charge.recurring ежемесячно |
| Prepaid | Авансовый платёж на период | Internet 30 дней — 500₽ | charge.prepaid при активации |
| Usage-based | По потреблению (CDR/UDR) | VoIP — 1.5₽/мин | charge.usage по данным Mediation |
| One-time | Разовый платёж | Подключение — 1000₽ | charge.one_time при активации |
| Equipment rental | Аренда оборудования | Роутер — 100₽/мес | charge.recurring отдельной строкой |
Агрегаты
ProductOffering (read-heavy, admin-mutated)
Loading diagram...
Subscription (write-heavy, клиентский агрегат)
Loading diagram...
| Статус | Описание | Триггер |
|---|---|---|
PENDING | Создана, ожидает провижининга | CreateSubscription RPC |
ACTIVE | Работает, тарификация идёт | ProvisioningSuccessEvent |
SUSPENDED | Приостановлена (долг/админ) | DunningStageChangedEvent или ручная |
TERMINATED | Расторгнута, ресурсы освобождены | Ручная / автоматическая (dunning D+N) |
ConnectRPC API
service ProductService {
rpc GetProduct(GetProductRequest) returns (GetProductResponse);
rpc ListProducts(ListProductsRequest) returns (ListProductsResponse);
rpc CreateProduct(CreateProductRequest) returns (CreateProductResponse);
rpc CreateSubscription(CreateSubscriptionRequest) returns (CreateSubscriptionResponse);
rpc GetSubscription(GetSubscriptionRequest) returns (GetSubscriptionResponse);
rpc ChangeSubscription(ChangeSubscriptionRequest) returns (ChangeSubscriptionResponse);
rpc SuspendSubscription(SuspendSubscriptionRequest) returns (SuspendSubscriptionResponse);
rpc ResumeSubscription(ResumeSubscriptionRequest) returns (ResumeSubscriptionResponse);
rpc TerminateSubscription(TerminateSubscriptionRequest) returns (TerminateSubscriptionResponse);
}| Метод | RBAC | Idempotent | Описание |
|---|---|---|---|
ListProducts | public | — | Каталог тарифов (кэшируется Redis 5m) |
CreateSubscription | isp-operator+ | ✅ | Создать подписку → event subscription.activated |
ChangeSubscription | isp-operator+ | ✅ | Смена тарифа → event tariff.changed |
SuspendSubscription | isp-operator+ | ✅ | Приостановка → event subscription.suspended |
TerminateSubscription | isp-operator+ | ✅ | Расторжение → event subscription.terminated |
Доменные события
Exchange: product.events (Topic)
| Routing Key | Событие | Потребители |
|---|---|---|
subscription.activated | SubscriptionActivatedEvent | Provisioning, Billing |
subscription.suspended | SubscriptionSuspendedEvent | Provisioning |
subscription.resumed | SubscriptionResumedEvent | Provisioning |
subscription.terminated | SubscriptionTerminatedEvent | Provisioning, Billing |
subscription.tariff_changed | TariffChangedEvent | Provisioning (CoA), Billing (перерасчёт) |
Зависимости
Loading diagram...
База данных
- PostgreSQL (
product_db) - Каталог продуктов кэшируется в Redis (TTL 5 мин)
- Индексы: B-tree на
category,segment,is_active
Background Jobs (BullMQ)
| Job | Расписание | Описание |
|---|---|---|
product.refresh_cache | Каждые 5 мин | Инвалидация Redis-кэша каталога |
subscription.auto_terminate | Ежедневно, 02:00 | Авто-расторжение подписок в dunning D+N |
Ссылки:
- Protobuf-контракт: product/v1/product_service.proto
- Слой BSS: BSS Layer
- Dunning-процесс: Billing & Finance