G-SERVICE Docs
Архитектура 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);
}
МетодRBACIdempotentОписание
ListProductspublicКаталог тарифов (кэшируется Redis 5m)
CreateSubscriptionisp-operator+Создать подписку → event subscription.activated
ChangeSubscriptionisp-operator+Смена тарифа → event tariff.changed
SuspendSubscriptionisp-operator+Приостановка → event subscription.suspended
TerminateSubscriptionisp-operator+Расторжение → event subscription.terminated

Доменные события

Exchange: product.events (Topic)

Routing KeyСобытиеПотребители
subscription.activatedSubscriptionActivatedEventProvisioning, Billing
subscription.suspendedSubscriptionSuspendedEventProvisioning
subscription.resumedSubscriptionResumedEventProvisioning
subscription.terminatedSubscriptionTerminatedEventProvisioning, Billing
subscription.tariff_changedTariffChangedEventProvisioning (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

Ссылки:

On this page