Bỏ qua để đến nội dung
getnextpdf.com

Enterprise phiên bản

Billing — Tài liệu tham chiếu chuyên sâu

Trang này là tài liệu tham chiếu sâu cho bề mặt billing của NextPDF Enterprise. Bề mặt có hai lớp. Mô hình billing trong NextPDF\Enterprise\Billing định nghĩa các bậc gói, các hạn mức, các chính sách vượt mức, và các cảnh báo sử dụng đã khử trùng lặp. Substrate thực thi trong NextPDF\Enterprise\Billing\Substrate đặt mô hình đó lên đường request trực tiếp, fail-closed và an toàn với đồng thời. Các điểm vào là PlanRegistry, QuotaManager, OverageCalculator, BillingAlertService, và QuotaEnforcementGuard. Để biết hướng dẫn ở mức luồng công việc, xem trang năng lực Billing.

Năng lực này được phát hành trong NextPDF Enterprise (nextpdf/enterprise) và kích hoạt với một license envelope bậc Enterprise. Một triển khai không có quyền đó sẽ không nạp các lớp của năng lực này. So sánh các phiên bản và lấy giấy phép.

Billing là một năng lực Enterprise nền tảng không có cờ riêng cho từng tính năng; nó có sẵn ngay khi gói Enterprise được cài đặt cạnh gói Core. NextPDF Core (Apache-2.0) và NextPDF Pro không có mô hình gói, hạn mức, hay vượt mức nào; bề mặt này không có bản tương đương ở bậc thấp hơn. Những gì gói bao gồm, các hạn mức, và các điều khoản thương mại được chi phối bởi thỏa thuận giấy phép, không phải bởi việc thực thi tại runtime; tài liệu tham chiếu này không phải là một ý kiến pháp lý hay hợp đồng.

Mọi ký hiệu nằm dưới NextPDF\Enterprise\Billing. Các dòng đánh dấu substrate nằm dưới NextPDF\Enterprise\Billing\Substrate. TenantContext là kiểu tenant đã xác thực từ NextPDF\Enterprise\SaaS.

Ký hiệuTham sốHành vi mặc địnhTrả vềNém hoặc thất bại vớiGhi chú
SaaSPlan (enum)Các bậc gói backed bằng chuỗi: standard, advanced, high_controlKhông némlabel() trả về tên hiển thị
PlanDefinition::__constructSaaSPlan $plan, float $includedCuQuota, list<CapabilityCode> $capabilities, non-empty-string $priceTier, bool $intelligencePackIncluded, bool $privacyPackIncludedValue object gói bất biến; lưu các đầu vào như được cung cấpInstance mớiKhông némfinal readonly; các thuộc tính public được promote
PlanDefinition::includesCapabilityCapabilityCode $capabilityKiểm tra thành viên theo định danh nghiêm ngặtboolKhông ném
PlanRegistry::__constructlist<PlanDefinition> $definitionsLập chỉ mục các định nghĩa theo bậc; định nghĩa cuối cùng cho mỗi bậc thắngRegistry mớiKhông némDành cho test và các tập gói white-label
PlanRegistry::getSaaSPlan $planTra cứu gói chuẩn (canonical)PlanDefinitionInvalidArgumentException khi gói chưa được đăng ký
PlanRegistry::hasSaaSPlan $planKiểm tra đăng kýboolKhông ném
PlanRegistry::defaultRegistry (static)Mặc định production: Standard 1,000 CU; Advanced 5,000 CU cộng Intelligence Pack; High Control 20,000 CU cộng Intelligence Pack và Privacy PackPlanRegistryKhông némDùng trừ khi các điều khoản hợp đồng yêu cầu định nghĩa tùy chỉnh
OveragePolicy (enum)hard_stop, soft_stop, budget_alertKhông némhttpStatusCode() ánh xạ 402 / 429 / 200; isBlocking() chỉ đúng với hard stop và soft stop
QuotaManager::__constructPlanRegistry $planRegistry, OveragePolicy $overagePolicyGắn registry với một chính sáchInstance mớiKhông ném
QuotaManager::checkQuotaTenantContext $tenant, SaaSPlan $plan, float $currentCuTrả về im lặng khi ở mức hoặc dưới hạn mức, hoặc dưới một chính sách không chặnvoidQuotaExceededException khi vượt mức nghiêm ngặt dưới một chính sách chặn; InvalidArgumentException từ registry khi gói chưa đăng kýresetsAt = ngày đầu tiên của tháng tiếp theo, nửa đêm UTC
QuotaManager::remainingQuotaSaaSPlan $plan, float $currentCuĐọc thuần; không bao giờ chặnfloatInvalidArgumentException từ registryÂm khi vượt mức
QuotaManager::usagePercentageSaaSPlan $plan, float $currentCuĐọc thuần; không bao giờ chặnfloatInvalidArgumentException từ registry0.0 khi hạn mức đi kèm không dương; trên 1.0 khi vượt mức
OverageCalculator::calculatePlanDefinition $plan, float $currentCuTính một snapshot vượt mức bất biếnOverageResultKhông némfinal readonly, không trạng thái
OverageResultincludedCu, usedCu, overageCu, usageRatio, isOverageKết quả tính toán bất biếnKhông némoverageCu = max(0, used - included); isOverage yêu cầu vượt mức nghiêm ngặt
BillingAlertType (enum)quota_warning_80, quota_warning_100, budget_exceeded, monthly_cap_reachedKhông némthreshold() 0.8 / 1.0 / 1.0 / 1.0; severity() warning / critical / critical / critical
BillingAlertService::__constructAlertStateRepositoryInterface $alertStateGắn kho khử trùng lặpInstance mớiKhông ném
BillingAlertService::evaluateTenantContext $tenant, SaaSPlan $plan, PlanDefinition $planDef, float $currentCuPhát các cảnh báo chưa-phát theo thứ tự ngưỡng tăng dần và ghi lại chúnglist<BillingAlertType>InvalidArgumentException khi gói/định nghĩa không khớpKhóa dedup: tenant, loại, kỳ UTC YYYY-MM
BillingAlertService::clearAlertsTenantContext $tenantXóa trạng thái đã-phát của tenant cho kỳ UTC hiện tạivoidCác lỗi do repository định nghĩa được lan truyềnVũ trang lại các cảnh báo trong cùng kỳ
AlertStateRepositoryInterfacehasAlertFired(), markAlertFired(), clearForPeriod()Contract lưu bền cho khử trùng lặp cảnh báoTheo từng phương thứcDo hiện thực định nghĩaNgười vận hành sở hữu độ bền qua các bản sao
InMemoryAlertStateRepositoryTrạng thái đã-phát backed bằng mảngTheo interfaceKhông némChỉ cho vòng đời một-request và test
QuotaExceededExceptionChỉ đọc currentCu, limitCu, resetsAt, tenantId, isSaaSTừ chối hạn mức nhận biết chế độ triển khaiLà throwablehttpStatusCode() 402 SaaS / 403 on-prem; specCode() SPEC-BILLING-003 / SPEC-LIC-001; toErrorEnvelope() cho ra một error body có cấu trúc
DeploymentMode (enum)saas, self_hosted_oss, local_developmentKhông némSubstrate. enforcesQuota() chỉ đúng cho Saas; việc opt-out luôn tường minh
QuotaEnforcementGuard::__constructDeploymentMode, PlanResolverInterface, QuotaManager, UsageCounterStoreInterfaceLắp ráp cổng hạn mức trực tiếpInstance mớiKhông némSubstrate. final readonly
QuotaEnforcementGuard::enforce?TenantContext $tenant, non-empty-string $featureKey, float $amount = 1.0Cổng hạn mức fail-closed với đặt chỗ nguyên tửQuotaDecision (chỉ các kết quả được phép)Xem phân loại từ chối bên dướiSubstrate. Gắn sau khi xác thực tenant, trước handler tính phí
PlanResolverInterface::resolveTenantContext $tenantPhân giải một tenant thành gói và các chính sách theo từng tính năng của nóResolvedPlanNoPlanForTenantExceptionSubstrate. Một fallback gói-mặc-định cho tenant không rõ là một khiếm khuyết
RegistryPlanResolverarray<non-empty-string, ResolvedPlan> $plansByTenantResolver backed bằng mapResolvedPlanNoPlanForTenantException cho các tenant chưa được ánh xạSubstrate. Fail-closed theo thiết kế
ResolvedPlan::policyFornon-empty-string $featureKeyTra cứu chính sách trên gói đã phân giải?QuotaPolicyKhông némSubstrate. null nghĩa là tính năng không rõ; guard từ chối nó
QuotaPolicynon-empty-string $featureKey, float $limit, OveragePolicy $overagePolicyGiới hạn theo từng tính năng và chính sách khi vi phạmKhông némSubstrate. UNLIMITED = -1.0; giới hạn 0.0 là không cho phép gì, không phải không giới hạn; isUnlimited(), isBlocking()
QuotaDecisionCác static bypassed(), unlimited(), consumed()Value object kết quả được phépQuotaDecisionKhông némSubstrate. isAllowed() luôn đúng; mọi từ chối đều ném thay vì thế
UsageCounterSnapshot dòng: tenant, tính năng, biên kỳ, used, limit, updatedAtDòng sử dụng bất biếnKhông némSubstrate. remaining() có thể âm; wouldExceed() là nghiêm ngặt
UsageCounterStoreInterface::getTenant, tính năng, biên kỳ, float $limitĐọc dòng sử dụng, tạo nó với used = 0 khi vắng mặtUsageCounterUsageStoreUnavailableExceptionSubstrate. Không bao giờ trả về giá trị falsy khi backend lỗi
UsageCounterStoreInterface::tryConsumeTenant, tính năng, biên kỳ, float $amount, float $limitĐặt chỗ compare-and-set nguyên tử trong giới hạn?UsageCounter (null khi việc đặt chỗ sẽ vượt giới hạn)UsageStoreUnavailableExceptionSubstrate. Phải là một thao tác nguyên tử đơn lẻ đối với kho lưu trữ nền
InMemoryUsageCounterStoreHiện thực tham chiếu in-process của contract khoTheo interfaceTheo interfaceSubstrate. Chỉ một tiến trình; tài liệu hóa bất biến về tính nguyên tử
QuotaEnforcementException (abstract)Kiểu cơ sở của mọi từ chối substrateLà họ throwableSubstrate. Mỗi subtype khai báo httpStatusCode()
public function checkQuota(TenantContext $tenant, SaaSPlan $plan, float $currentCu): void
public function evaluate(
TenantContext $tenant,
SaaSPlan $plan,
PlanDefinition $planDef,
float $currentCu,
): array
public function enforce(?TenantContext $tenant, string $featureKey, float $amount = 1.0): QuotaDecision
public function tryConsume(
string $tenantId,
string $featureKey,
DateTimeImmutable $periodStart,
DateTimeImmutable $periodEnd,
float $amount,
float $limit,
): ?UsageCounter;

Phân loại từ chối của QuotaEnforcementGuard::enforce

ExceptionTrạng thái HTTPĐược ném khi
MissingTenantContextException401Chế độ SaaS mà không có ngữ cảnh tenant đã xác thực
NoPlanForTenantException402Resolver không tìm thấy gói nào được gán cho tenant
UnknownFeatureException402Gói đã phân giải không định nghĩa chính sách nào cho feature key
UsageStoreUnavailableException503Không thể đọc hoặc cập nhật nguyên tử usage store; cũng được ném cho $amount không dương
QuotaExceededException402 (SaaS) / 403 (on-prem)Hạn mức của một chính sách chặn bị vượt, hoặc một đặt chỗ đồng thời đã tiêu thụ headroom cuối cùng
  • Registry mặc định cung cấp ba bậc (Standard / Advanced / High Control) với hạn mức CU và các tập năng lực tăng dần. Một yêu cầu cho gói chưa đăng ký thất bại với một InvalidArgumentException tường minh.
  • QuotaManager::checkQuota() chỉ phát sinh khi cả hai điều kiện đúng: chính sách là chặn, và mức sử dụng hiện tại nghiêm ngặt vượt trên hạn mức đi kèm. Một chính sách budget-alert không bao giờ phát sinh; việc vượt mức được báo hiệu qua các cảnh báo.
  • remainingQuota()usagePercentage() là các đọc thuần và không bao giờ chặn. Hạn mức còn lại trở thành âm khi vượt mức; phần trăm sử dụng vượt 1.0 khi vượt mức.
  • Các cảnh báo được đánh giá theo thứ tự ngưỡng tăng dần: cảnh báo 80%, cảnh báo 100% (critical), rồi budget-exceeded (critical). Budget-exceeded được gate trên việc vượt mức nghiêm ngặt; mức sử dụng đúng 100% phát ra cảnh báo 100%, không phải budget-exceeded.
  • Mỗi loại cảnh báo phát ra nhiều nhất một lần cho mỗi tenant mỗi kỳ billing. Trạng thái đã-phát được ghi qua AlertStateRepositoryInterface, nên việc khử trùng lặp bền như hiện thực được chọn.
  • Khóa khử trùng lặp nhúng kỳ UTC YYYY-MM. Do đó một tháng dương lịch mới tự động vũ trang lại mọi loại cảnh báo; không cần lời gọi clear nào cho việc vũ trang lại khi chuyển kỳ. clearAlerts() xóa kỳ hiện tại, việc này vũ trang lại các cảnh báo giữa kỳ, ví dụ sau khi nâng cấp gói.
  • Một guard plan-mismatch trong evaluate() từ chối một lời gọi khi gói được cung cấp và định nghĩa gói không khớp, bảo vệ chống lại một định nghĩa từ một bậc khác với gói của tenant.
  • Mọi phép tính kỳ được neo vào UTC. Thời điểm reset vượt-hạn-mức là ngày đầu tiên của tháng dương lịch tiếp theo lúc nửa đêm UTC; một phản hồi soft-stop nên quảng bá nó làm chân trời thử lại.
  • QuotaEnforcementGuard là fail-closed trong chế độ SaaS. Thiếu tenant, thiếu gói, tính năng không rõ, sự cố kho, và vi phạm hạn mức đều từ chối; không có gì lọt qua thành một cho-phép ngầm định. Các triển khai không-SaaS chỉ opt out bằng cách dựng guard với một DeploymentMode không-SaaS.
  • Các chính sách chặn đặt chỗ mức sử dụng qua UsageCounterStoreInterface::tryConsume, một compare-and-set nguyên tử. Các request đồng thời không thể cùng nhau đẩy mức sử dụng vượt giới hạn; kẻ thua trong cuộc đua nhận QuotaExceededException dù pre-check đã qua.
  • Dưới một chính sách budget-alert, guard ghi lại mức tiêu thụ theo kiểu best-effort và không bao giờ từ chối; một đặt chỗ vượt trần mềm vẫn ghi dòng ở mức giới hạn.
  • QuotaExceededException nhận biết chế độ triển khai: các từ chối SaaS ánh xạ tới HTTP 402 với spec code SPEC-BILLING-003 và được đánh dấu có thể thử lại; các từ chối on-prem ánh xạ tới HTTP 403 với SPEC-LIC-001.
  • Thư viện không tự phát ra các phản hồi HTTP. Các mã trạng thái được khai báo là contract cho lớp edge, lớp này ánh xạ một từ chối được ném thành một phản hồi và không được gọi handler tính phí.
  • Hạn mức đi kèm không dương. usagePercentage(), evaluate(), và OverageCalculator::calculate() đều cho ra tỷ lệ sử dụng 0.0 thay vì chia cho không. Khi đó các cảnh báo ngưỡng không bao giờ phát chỉ từ tỷ lệ.
  • Budget-alert cộng với vượt mức lớn. Cả manager và guard đều trả về các kết quả được phép. Đừng coi việc không có exception là bằng chứng rằng đang trong hạn mức; hãy tham khảo OverageResult hoặc luồng cảnh báo.
  • Đúng ở giới hạn. checkQuota() tại currentCu == includedCuQuota thì qua. BudgetExceeded yêu cầu vượt mức nghiêm ngặt. UsageCounter::wouldExceed() cũng nghiêm ngặt.
  • MonthlyCapReached. Enum khai báo loại cảnh báo thứ tư này, nhưng BillingAlertService::evaluate() không bao giờ phát ra nó; danh sách ứng viên của nó chỉ bao gồm ba cảnh báo ngưỡng. Nó được dành riêng cho các emitter theo dõi cap bên ngoài module này.
  • Định nghĩa bậc trùng lặp. PlanRegistry lập chỉ mục theo giá trị bậc; định nghĩa cuối cùng cho một bậc âm thầm thay thế các định nghĩa trước. Hãy dựng registry từ một danh sách đã khử trùng lặp.
  • Không-cho-phép so với không-giới-hạn. Một giới hạn QuotaPolicy bằng 0.0 nghĩa là mọi mức tiêu thụ trong kỳ đều là vượt mức. Chỉ sentinel âm UNLIMITED mới vô hiệu hóa việc đo lường; isUnlimited() không bao giờ chặn.
  • Lượng đặt chỗ không dương. enforce() từ chối một $amount không dương theo kiểu fail-closed với UsageStoreUnavailableException (503). Đây là khiếm khuyết của người gọi, không phải sự cố kho.
  • Sự cố kho. Bất kỳ lỗi đọc hay đặt chỗ nào đều nổi lên dưới dạng UsageStoreUnavailableException và từ chối. Guard không bao giờ cho phép công việc không-được-đo trong khi bộ đo hỏng.
  • Các hiện thực in-memory. InMemoryAlertStateRepositoryInMemoryUsageCounterStore chỉ đúng trong một tiến trình PHP. Các triển khai đa-bản-sao phải cung cấp các hiện thực được backed bởi một datastore có tính nguyên tử thực sự; một kho đọc-rồi-ghi là một khiếm khuyết cho phép vượt-hạn-mức dưới tải.
  • Chế độ FIPS. Billing không thực hiện thao tác mật mã nào của riêng nó và không có hành vi riêng cho FIPS. Định danh tenant mà nó tiêu thụ phải bắt nguồn từ một ngữ cảnh đã xác thực có tư thế FIPS được tài liệu hóa cùng với bề mặt SaaS.
Khẳng địnhTiêu chuẩnĐiều khoản
Mã trạng thái 402 được dành riêng cho sử dụng tương lai; nó không mang ngữ nghĩa request quy chuẩn nào của riêng nó.RFC 9110§15.5.3
429 cho biết client đã gửi quá nhiều request trong một khoảng thời gian nhất định (“rate limiting”).RFC 6585§4
Retry-After cho biết user agent nên chờ bao lâu trước khi thực hiện một request tiếp theo.RFC 9110§10.2.3

Mọi điều khoản đều được diễn giải lại; NextPDF không tái hiện văn bản quy chuẩn. NextPDF không đưa ra khẳng định phù hợp hay chứng nhận giao thức HTTP nào cho bề mặt này. Ánh xạ 402 / 429 / 200 do OveragePolicy::httpStatusCode() khai báo và các mã từ chối 401 / 402 / 503 của guard là một quy ước sản phẩm phù hợp với các điều khoản trên: RFC 9110 dành riêng 402, nên việc dùng nó cho từ-chối-thanh-toán ở đây là quy ước ngành phổ biến, không phải một ngữ nghĩa do IETF định nghĩa. Chân trời thử lại soft-stop (resetsAt) là giá trị mà một lớp edge nên phơi bày làm hướng dẫn Retry-After. Việc phát ra các phản hồi HTTP thực, các header, và hành vi caching là trách nhiệm của ứng dụng chủ.

  • Kết hợp mô hình từ PlanRegistry::defaultRegistry(), một OveragePolicy, và một QuotaManager; thêm BillingAlertService với một hiện thực AlertStateRepositoryInterface bền để cảnh báo.
  • Gắn QuotaEnforcementGuard trong pipeline request sau khi xác thực tenant và trước handler tính phí. Bắt QuotaEnforcementExceptionQuotaExceededException của billing ở lớp edge và ánh xạ httpStatusCode() tới phản hồi.
  • Các định nghĩa gói trong module này là nguồn duy nhất của sự thật cho billing; đừng duy trì một định nghĩa billing song song ở nơi khác trong triển khai của bạn.
  • Các hiện thực in-memory làm cho toàn bộ bề mặt có thể unit-test mà không cần I/O. Các test biên được khuyến nghị: mức sử dụng đúng ở hạn mức, một đơn vị trên, các ngưỡng tỷ lệ ở 0.8 và 1.0, guard plan-mismatch, cuộc đua CAS (hai đặt chỗ đối với đơn vị headroom cuối cùng), và từ chối do sự cố kho.
  • Các lớp mô hình core mang @since 2.2.0; substrate mang @since 2.3.0. Dòng gói hiện tại là 3.1.0.
  • Người vận hành sở hữu các hiện thực repository trạng thái cảnh báo và usage-store, độ bền của chúng qua các bản sao, và bất kỳ việc vũ trang lại cảnh báo giữa kỳ nào qua clearAlerts().

Trang này chỉ tài liệu hóa hành vi quan sát được từ bên ngoài và bề mặt API công khai được hỗ trợ. Các đường dẫn namespace nội bộ, lớp helper, bảng cơ chế, tên tệp runbook, và tiền tố ticket nằm ngoài phạm vi.