ข้ามไปยังเนื้อหา
getnextpdf.com

Enterprise รุ่น

Billing — เอกสารอ้างอิงเชิงลึก

หน้านี้เป็นเอกสารอ้างอิงเชิงลึกสำหรับพื้นผิว billing ของ NextPDF Enterprise พื้นผิวนี้มีสองชั้น โมเดล billing ใน NextPDF\Enterprise\Billing กำหนดระดับชั้นของแผน โควตา นโยบาย overage และการแจ้งเตือนการใช้งานที่ผ่านการ deduplication ซับสเตรตการบังคับใช้ใน NextPDF\Enterprise\Billing\Substrate วางโมเดลนั้นไว้บนเส้นทางคำขอจริง แบบ fail-closed และปลอดภัยต่อการทำงานพร้อมกัน จุดเข้าใช้งานคือ PlanRegistry QuotaManager OverageCalculator BillingAlertService และ QuotaEnforcementGuard สำหรับคู่มือระดับเวิร์กโฟลว์ ดูหน้าความสามารถ Billing

ความสามารถนี้จัดส่งใน NextPDF Enterprise (nextpdf/enterprise) และเปิดใช้งานด้วยซองใบอนุญาตระดับ Enterprise การปรับใช้ที่ไม่มีสิทธิ์ดังกล่าวจะไม่โหลดคลาสของความสามารถนี้ เปรียบเทียบรุ่นและรับใบอนุญาต

Billing เป็นความสามารถพื้นฐานของ Enterprise ที่ไม่มีแฟล็กต่อฟีเจอร์แยกต่างหาก พร้อมใช้งานเมื่อติดตั้งแพ็กเกจ Enterprise ข้าง ๆ แพ็กเกจ Core แล้ว NextPDF Core (Apache-2.0) และ NextPDF Pro ไม่มีโมเดลแผน โควตา หรือ overage พื้นผิวนี้ไม่มีสิ่งเทียบเท่าในระดับที่ต่ำกว่า สิ่งที่รวมอยู่ในแผน โควตา และข้อกำหนดเชิงพาณิชย์อยู่ภายใต้ข้อตกลงใบอนุญาต ไม่ใช่การบังคับใช้ในขณะรันไทม์ เอกสารอ้างอิงนี้ไม่ใช่ความเห็นทางกฎหมายหรือทางสัญญา

สัญลักษณ์ทั้งหมดอยู่ภายใต้ NextPDF\Enterprise\Billing แถวที่ทำเครื่องหมาย substrate อยู่ภายใต้ NextPDF\Enterprise\Billing\Substrate TenantContext เป็นชนิด tenant ที่ผ่านการตรวจสอบสิทธิ์จาก NextPDF\Enterprise\SaaS

สัญลักษณ์พารามิเตอร์พฤติกรรมเริ่มต้นคืนค่าโยนหรือล้มเหลวด้วยหมายเหตุ
SaaSPlan (enum)ระดับชั้นแผนที่ backed ด้วยสตริง คือ standard, advanced, high_controlไม่โยนlabel() คืนชื่อสำหรับแสดงผล
PlanDefinition::__constructSaaSPlan $plan, float $includedCuQuota, list<CapabilityCode> $capabilities, non-empty-string $priceTier, bool $intelligencePackIncluded, bool $privacyPackIncludedออบเจ็กต์ค่าแผนที่ไม่เปลี่ยนแปลง เก็บอินพุตตามที่ให้มาอินสแตนซ์ใหม่ไม่โยนfinal readonly พร็อพเพอร์ตี้สาธารณะแบบ promoted
PlanDefinition::includesCapabilityCapabilityCode $capabilityตรวจสอบการเป็นสมาชิกด้วยเอกลักษณ์แบบเคร่งครัดboolไม่โยน
PlanRegistry::__constructlist<PlanDefinition> $definitionsจัดทำดัชนีคำนิยามตามระดับชั้น คำนิยามสุดท้ายต่อระดับชั้นเป็นผู้ชนะรีจิสทรีใหม่ไม่โยนสำหรับการทดสอบและชุดแผนแบบ white-label
PlanRegistry::getSaaSPlan $planการ lookup แผนเชิงบัญญัติPlanDefinitionInvalidArgumentException เมื่อแผนไม่ได้ลงทะเบียน
PlanRegistry::hasSaaSPlan $planการตรวจสอบการลงทะเบียนboolไม่โยน
PlanRegistry::defaultRegistry (static)ค่าเริ่มต้นสำหรับการใช้งานจริง คือ Standard 1,000 CU; Advanced 5,000 CU บวก Intelligence Pack; High Control 20,000 CU บวก Intelligence และ Privacy PacksPlanRegistryไม่โยนใช้ตัวนี้เว้นแต่ข้อกำหนดตามสัญญาจะกำหนดคำนิยามกำหนดเอง
OveragePolicy (enum)hard_stop, soft_stop, budget_alertไม่โยนhttpStatusCode() แมป 402 / 429 / 200; isBlocking() เป็นจริงเฉพาะ hard และ soft stop เท่านั้น
QuotaManager::__constructPlanRegistry $planRegistry, OveragePolicy $overagePolicyผูกรีจิสทรีเข้ากับหนึ่งนโยบายอินสแตนซ์ใหม่ไม่โยน
QuotaManager::checkQuotaTenantContext $tenant, SaaSPlan $plan, float $currentCuคืนค่าเงียบ ๆ เมื่ออยู่ที่หรือต่ำกว่าโควตา หรือภายใต้นโยบายที่ไม่บล็อกvoidQuotaExceededException เมื่อ overage แบบเคร่งครัดภายใต้นโยบายแบบบล็อก; InvalidArgumentException จากรีจิสทรีเมื่อแผนไม่ได้ลงทะเบียนresetsAt = วันแรกของเดือนถัดไป เที่ยงคืน UTC
QuotaManager::remainingQuotaSaaSPlan $plan, float $currentCuการอ่านล้วน ไม่เคยบล็อกfloatInvalidArgumentException ของรีจิสทรีเป็นลบเมื่อ overage
QuotaManager::usagePercentageSaaSPlan $plan, float $currentCuการอ่านล้วน ไม่เคยบล็อกfloatInvalidArgumentException ของรีจิสทรี0.0 เมื่อโควตาที่รวมอยู่ไม่เป็นบวก; สูงกว่า 1.0 เมื่อ overage
OverageCalculator::calculatePlanDefinition $plan, float $currentCuคำนวณสแนปช็อต overage ที่ไม่เปลี่ยนแปลงOverageResultไม่โยนfinal readonly ไร้สถานะ
OverageResultincludedCu, usedCu, overageCu, usageRatio, isOverageผลการคำนวณที่ไม่เปลี่ยนแปลงไม่โยนoverageCu = max(0, used - included); isOverage ต้องการ overage แบบเคร่งครัด
BillingAlertType (enum)quota_warning_80, quota_warning_100, budget_exceeded, monthly_cap_reachedไม่โยนthreshold() 0.8 / 1.0 / 1.0 / 1.0; severity() warning / critical / critical / critical
BillingAlertService::__constructAlertStateRepositoryInterface $alertStateผูกกับที่จัดเก็บสำหรับการ deduplicationอินสแตนซ์ใหม่ไม่โยน
BillingAlertService::evaluateTenantContext $tenant, SaaSPlan $plan, PlanDefinition $planDef, float $currentCuทำงานการแจ้งเตือนที่ยังไม่ได้ทำงานตามลำดับเกณฑ์จากน้อยไปมากและบันทึกไว้list<BillingAlertType>InvalidArgumentException เมื่อแผน/คำนิยามไม่ตรงกันคีย์ dedup คือ tenant ชนิด และรอบ YYYY-MM แบบ UTC
BillingAlertService::clearAlertsTenantContext $tenantล้างสถานะที่ทำงานแล้วของ tenant สำหรับรอบ UTC ปัจจุบันvoidความล้มเหลวที่ repository กำหนดจะถูกส่งต่อติดตั้งการแจ้งเตือนใหม่ภายในรอบเดียวกัน
AlertStateRepositoryInterfacehasAlertFired(), markAlertFired(), clearForPeriod()สัญญาการคงอยู่สำหรับการ deduplication การแจ้งเตือนแบบคงทนตามแต่ละเมธอดกำหนดโดยการนำไปใช้ผู้ดำเนินการเป็นเจ้าของความคงทนข้าม replica
InMemoryAlertStateRepositoryสถานะที่ทำงานแล้วที่ backed ด้วยอาร์เรย์ตามอินเทอร์เฟซไม่โยนสำหรับวงจรชีวิตคำขอเดียวและการทดสอบเท่านั้น
QuotaExceededExceptionReadonly currentCu, limitCu, resetsAt, tenantId, isSaaSการปฏิเสธโควตาที่รับรู้โหมดการปรับใช้เป็นตัว throwablehttpStatusCode() 402 SaaS / 403 on-prem; specCode() SPEC-BILLING-003 / SPEC-LIC-001; toErrorEnvelope() ให้เนื้อความ error แบบมีโครงสร้าง
DeploymentMode (enum)saas, self_hosted_oss, local_developmentไม่โยนSubstrate. enforcesQuota() เป็นจริงเฉพาะ Saas เท่านั้น การ opt-out ชัดเจนเสมอ
QuotaEnforcementGuard::__constructDeploymentMode, PlanResolverInterface, QuotaManager, UsageCounterStoreInterfaceประกอบเกตโควตาจริงอินสแตนซ์ใหม่ไม่โยนSubstrate. final readonly
QuotaEnforcementGuard::enforce?TenantContext $tenant, non-empty-string $featureKey, float $amount = 1.0เกตโควตาแบบ fail-closed พร้อมการจองแบบ atomicQuotaDecision (เฉพาะผลลัพธ์ที่อนุญาตเท่านั้น)ดู taxonomy การปฏิเสธด้านล่างSubstrate. ติดตั้งหลังการตรวจสอบสิทธิ์ tenant ก่อน handler ที่เรียกเก็บเงินได้
PlanResolverInterface::resolveTenantContext $tenantแปลง tenant ไปยังแผนและนโยบายต่อฟีเจอร์ของมันResolvedPlanNoPlanForTenantExceptionSubstrate. การถอยกลับไปใช้แผนเริ่มต้นสำหรับ tenant ที่ไม่รู้จักเป็นข้อบกพร่อง
RegistryPlanResolverarray<non-empty-string, ResolvedPlan> $plansByTenantตัว resolver ที่ backed ด้วยแมปResolvedPlanNoPlanForTenantException สำหรับ tenant ที่ไม่ได้แมปSubstrate. fail-closed โดยการออกแบบ
ResolvedPlan::policyFornon-empty-string $featureKeyการ lookup นโยบายบนแผนที่แปลงแล้ว?QuotaPolicyไม่โยนSubstrate. null หมายถึงฟีเจอร์ที่ไม่รู้จัก guard จะปฏิเสธ
QuotaPolicynon-empty-string $featureKey, float $limit, OveragePolicy $overagePolicyขีดจำกัดต่อฟีเจอร์และนโยบายเมื่อเกินไม่โยนSubstrate. UNLIMITED = -1.0; ขีดจำกัด 0.0 คือไม่อนุญาตเลย ไม่ใช่ไม่จำกัด; isUnlimited(), isBlocking()
QuotaDecisionสแตติก bypassed(), unlimited(), consumed()ออบเจ็กต์ค่าผลลัพธ์ที่อนุญาตQuotaDecisionไม่โยนSubstrate. isAllowed() เป็นจริงเสมอ ทุกการปฏิเสธจะโยนแทน
UsageCounterสแนปช็อตแถว คือ tenant ฟีเจอร์ ขอบเขตรอบ used, limit, updatedAtแถวการใช้งานที่ไม่เปลี่ยนแปลงไม่โยนSubstrate. remaining() อาจเป็นลบ; wouldExceed() เป็นแบบเคร่งครัด
UsageCounterStoreInterface::getTenant ฟีเจอร์ ขอบเขตรอบ float $limitอ่านแถวการใช้งาน สร้างด้วย used = 0 เมื่อไม่มีUsageCounterUsageStoreUnavailableExceptionSubstrate. ไม่เคยคืนค่า falsy เมื่อ backend ล้มเหลว
UsageCounterStoreInterface::tryConsumeTenant ฟีเจอร์ ขอบเขตรอบ float $amount, float $limitการจองแบบ compare-and-set atomic ภายในขีดจำกัด?UsageCounter (null เมื่อการจองจะเกินขีดจำกัด)UsageStoreUnavailableExceptionSubstrate. ต้องเป็นการดำเนินการ atomic เดี่ยวต่อที่จัดเก็บเบื้องหลัง
InMemoryUsageCounterStoreการนำสัญญาที่จัดเก็บไปใช้แบบอ้างอิงในกระบวนการตามอินเทอร์เฟซตามอินเทอร์เฟซSubstrate. กระบวนการเดียวเท่านั้น บันทึกค่าคงที่ด้านความ atomic
QuotaEnforcementException (abstract)ชนิดฐานของทุกการปฏิเสธในซับสเตรตเป็นตระกูล throwableSubstrate. แต่ละชนิดย่อยประกาศ 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;

Taxonomy การปฏิเสธของ QuotaEnforcementGuard::enforce

Exceptionสถานะ HTTPยกขึ้นเมื่อ
MissingTenantContextException401โหมด SaaS ที่ไม่มีบริบท tenant ที่ผ่านการตรวจสอบสิทธิ์
NoPlanForTenantException402ตัว resolver ไม่พบแผนที่กำหนดให้ tenant
UnknownFeatureException402แผนที่แปลงแล้วไม่ได้กำหนดนโยบายสำหรับคีย์ฟีเจอร์
UsageStoreUnavailableException503ไม่สามารถอ่านหรืออัปเดตที่จัดเก็บการใช้งานแบบ atomic ได้; ยกขึ้นด้วยเมื่อ $amount ไม่เป็นบวก
QuotaExceededException402 (SaaS) / 403 (on-prem)โควตาของนโยบายแบบบล็อกถูกใช้เกิน หรือการจองพร้อมกันใช้พื้นที่ว่างสุดท้ายไปแล้ว
  • รีจิสทรีเริ่มต้นจัดส่งสามระดับชั้น (Standard / Advanced / High Control) ด้วยโควตา CU และชุดความสามารถที่เพิ่มขึ้น คำขอแผนที่ไม่ได้ลงทะเบียนจะล้มเหลวด้วย InvalidArgumentException ที่ชัดเจน
  • QuotaManager::checkQuota() ยกขึ้นเฉพาะเมื่อทั้งสองเงื่อนไขเป็นจริง คือ นโยบายเป็นแบบบล็อกและการใช้งานปัจจุบันสูงกว่าโควตาที่รวมอยู่อย่างเคร่งครัด นโยบาย budget-alert ไม่เคยยกขึ้น overage ถูกส่งสัญญาณผ่านการแจ้งเตือน
  • remainingQuota() และ usagePercentage() เป็นการอ่านล้วนและไม่เคยบล็อก โควตาที่เหลือเป็นลบเมื่อ overage เปอร์เซ็นต์การใช้งานเกิน 1.0 เมื่อ overage
  • การแจ้งเตือนประเมินตามลำดับเกณฑ์จากน้อยไปมาก คือ คำเตือน 80% คำเตือน 100% (critical) จากนั้น budget-exceeded (critical) budget-exceeded ถูกเกตที่ overage แบบเคร่งครัด การใช้งานที่พอดี 100% จะทำให้คำเตือน 100% ทำงาน ไม่ใช่ budget-exceeded
  • การแจ้งเตือนแต่ละชนิดทำงานได้มากที่สุดหนึ่งครั้งต่อ tenant ต่อรอบการเรียกเก็บเงิน สถานะที่ทำงานแล้วถูกบันทึกผ่าน AlertStateRepositoryInterface ดังนั้นการ deduplication จึงคงทนเท่ากับการนำไปใช้ที่เลือก
  • คีย์การ deduplication ฝังรอบ YYYY-MM แบบ UTC เดือนปฏิทินใหม่จึงติดตั้งการแจ้งเตือนทุกชนิดใหม่โดยอัตโนมัติ ไม่ต้องเรียก clear สำหรับการติดตั้งใหม่เมื่อ rollover clearAlerts() ล้างรอบปัจจุบัน ซึ่งติดตั้งการแจ้งเตือนใหม่กลางรอบ เช่น หลังการอัปเกรดแผน
  • ตัวป้องกัน plan-mismatch ใน evaluate() ปฏิเสธการเรียกที่แผนที่จัดหามาและคำนิยามแผนไม่ตรงกัน ป้องกันคำนิยามจากระดับชั้นอื่นที่ไม่ใช่แผนของ tenant
  • การคำนวณรอบทั้งหมดยึดกับ UTC เวลารีเซ็ต quota-exceeded คือวันแรกของเดือนปฏิทินถัดไปเที่ยงคืน UTC การตอบสนอง soft-stop ควรโฆษณาเป็นขอบเขตการลองใหม่
  • QuotaEnforcementGuard เป็น fail-closed ในโหมด SaaS tenant ที่ขาดหาย แผนที่ขาดหาย ฟีเจอร์ที่ไม่รู้จัก การขัดข้องของที่จัดเก็บ และการเกินโควตา ทั้งหมดจะปฏิเสธ ไม่มีสิ่งใดตกไปสู่การอนุญาตโดยปริยาย การปรับใช้ที่ไม่ใช่ SaaS จะ opt out ได้เฉพาะโดยการสร้าง guard ด้วย DeploymentMode ที่ไม่ใช่ SaaS
  • นโยบายแบบบล็อกจองการใช้งานผ่าน UsageCounterStoreInterface::tryConsume ซึ่งเป็น compare-and-set แบบ atomic คำขอพร้อมกันไม่สามารถผลักดันการใช้งานเกินขีดจำกัดร่วมกันได้ ผู้แพ้ในการแข่งขันจะได้รับ QuotaExceededException แม้ว่าการตรวจสอบก่อนหน้าจะผ่านแล้ว
  • ภายใต้นโยบาย budget-alert guard จะบันทึกการบริโภคแบบ best-effort และไม่เคยปฏิเสธ การจองที่เกินเพดานแบบนุ่มยังคงบันทึกแถวที่ขีดจำกัด
  • QuotaExceededException รับรู้โหมดการปรับใช้ คือ การปฏิเสธ SaaS แมปไปยัง HTTP 402 ด้วยรหัส spec SPEC-BILLING-003 และถูกทำเครื่องหมายว่าลองใหม่ได้; การปฏิเสธ on-prem แมปไปยัง HTTP 403 ด้วย SPEC-LIC-001
  • ไลบรารีไม่ปล่อยการตอบสนอง HTTP เอง โค้ดสถานะที่ประกาศเป็นสัญญาสำหรับชั้น edge ซึ่งแมปการปฏิเสธที่ถูกโยนไปยังการตอบสนอง และต้องไม่เรียก handler ที่เรียกเก็บเงินได้
  • โควตาที่รวมอยู่ซึ่งไม่เป็นบวก usagePercentage(), evaluate() และ OverageCalculator::calculate() ทั้งหมดให้อัตราส่วนการใช้งาน 0.0 แทนการหารด้วยศูนย์ การแจ้งเตือนตามเกณฑ์จึงไม่เคยทำงานจากอัตราส่วนเพียงอย่างเดียว
  • Budget-alert บวก overage ขนาดใหญ่ ทั้งตัวจัดการและ guard คืนผลลัพธ์ที่อนุญาต อย่าปฏิบัติต่อการไม่มี exception ว่าเป็นข้อพิสูจน์ว่าอยู่ภายในโควตา ให้ปรึกษา OverageResult หรือสตรีมการแจ้งเตือน
  • พอดีที่ขีดจำกัด checkQuota() ที่ currentCu == includedCuQuota จะผ่าน BudgetExceeded ต้องการ overage แบบเคร่งครัด UsageCounter::wouldExceed() เป็นแบบเคร่งครัดเช่นกัน
  • MonthlyCapReached enum ประกาศการแจ้งเตือนชนิดที่สี่นี้ แต่ BillingAlertService::evaluate() ไม่เคยปล่อยมัน รายการผู้สมัครของมันครอบคลุมเฉพาะการแจ้งเตือนตามเกณฑ์สามชนิดเท่านั้น มันถูกสงวนไว้สำหรับตัวปล่อยที่ติดตาม cap นอกโมดูลนี้
  • คำนิยามระดับชั้นซ้ำ PlanRegistry จัดทำดัชนีตามค่าระดับชั้น คำนิยามสุดท้ายสำหรับระดับชั้นจะแทนที่คำนิยามก่อนหน้าอย่างเงียบ ๆ สร้างรีจิสทรีจากรายการที่ deduplicate แล้ว
  • ไม่อนุญาตเลยเทียบกับไม่จำกัด ขีดจำกัด QuotaPolicy ที่ 0.0 หมายถึงทุกการบริโภคในรอบเป็น overage มีเพียง sentinel UNLIMITED ที่เป็นลบเท่านั้นที่ปิดการวัด isUnlimited() ไม่เคยบล็อก
  • จำนวนการจองที่ไม่เป็นบวก enforce() ปฏิเสธ $amount ที่ไม่เป็นบวกแบบ fail-closed ด้วย UsageStoreUnavailableException (503) นี่เป็นข้อบกพร่องของผู้เรียก ไม่ใช่การขัดข้องของที่จัดเก็บ
  • การขัดข้องของที่จัดเก็บ ความล้มเหลวในการอ่านหรือจองใด ๆ จะปรากฏเป็น UsageStoreUnavailableException และปฏิเสธ guard ไม่เคยอนุญาตงานที่ไม่ได้วัดขณะที่ตัววัดขัดข้อง
  • การนำไปใช้แบบ in-memory InMemoryAlertStateRepository และ InMemoryUsageCounterStore ถูกต้องภายในกระบวนการ PHP เดียวเท่านั้น การปรับใช้แบบหลาย replica ต้องจัดหาการนำไปใช้ที่ backed ด้วย datastore ที่มีความ atomic จริง ที่จัดเก็บแบบ read-then-write เป็นข้อบกพร่องที่ยอมให้เกินโควตาภายใต้โหลด
  • โหมด FIPS Billing ไม่ทำการดำเนินการทางการเข้ารหัสของตนเองและไม่มีพฤติกรรมเฉพาะของ FIPS อัตลักษณ์ของ tenant ที่มันใช้ต้องมาจากบริบทที่ผ่านการตรวจสอบสิทธิ์ซึ่งท่าที FIPS ของมันถูกบันทึกไว้กับพื้นผิว SaaS
ข้ออ้างมาตรฐานข้อ
โค้ดสถานะ 402 ถูกสงวนไว้สำหรับการใช้งานในอนาคต มันไม่มีความหมายเชิงคำขอตามบรรทัดฐานของตนเองRFC 9110§15.5.3
429 บ่งชี้ว่าไคลเอนต์ได้ส่งคำขอมากเกินไปในช่วงเวลาที่กำหนด (“rate limiting”)RFC 6585§4
Retry-After บ่งชี้ว่า user agent ควรรอนานเท่าใดก่อนที่จะทำคำขอติดตามผลRFC 9110§10.2.3

ทุกข้อถูกถอดความ NextPDF ไม่ได้ทำซ้ำข้อความตามบรรทัดฐาน NextPDF ไม่ได้อ้างความสอดคล้องหรือการรับรองโปรโตคอล HTTP สำหรับพื้นผิวนี้ การแมป 402 / 429 / 200 ที่ประกาศโดย OveragePolicy::httpStatusCode() และโค้ดการปฏิเสธ 401 / 402 / 503 ของ guard เป็นแบบแผนของผลิตภัณฑ์ที่สอดคล้องกับข้อข้างต้น คือ RFC 9110 สงวน 402 ไว้ ดังนั้นการใช้เพื่อปฏิเสธการชำระเงินที่นี่เป็นแบบแผนทั่วไปของอุตสาหกรรม ไม่ใช่ความหมายที่ IETF กำหนด ขอบเขตการลองใหม่แบบ soft-stop (resetsAt) เป็นค่าที่ชั้น edge ควรแสดงเป็นคำแนะนำ Retry-After การปล่อยการตอบสนอง HTTP หัวข้อ และพฤติกรรมการแคชจริงเป็นความรับผิดชอบของแอปพลิเคชันที่โฮสต์

  • ประกอบโมเดลจาก PlanRegistry::defaultRegistry() หนึ่ง OveragePolicy และ QuotaManager เพิ่ม BillingAlertService ด้วยการนำ AlertStateRepositoryInterface แบบคงทนไปใช้สำหรับการแจ้งเตือน
  • ติดตั้ง QuotaEnforcementGuard ในไปป์ไลน์คำขอหลังการตรวจสอบสิทธิ์ tenant และก่อน handler ที่เรียกเก็บเงินได้ จับ QuotaEnforcementException และ QuotaExceededException ของ billing ที่ edge และแมป httpStatusCode() ไปยังการตอบสนอง
  • คำนิยามแผนในโมดูลนี้เป็นแหล่งความจริงเพียงแหล่งเดียวสำหรับ billing อย่าดูแลคำนิยาม billing คู่ขนานที่อื่นในการปรับใช้ของคุณ
  • การนำไปใช้แบบ in-memory ทำให้พื้นผิวทั้งหมดทดสอบหน่วยได้โดยไม่ต้องมี I/O การทดสอบขอบเขตที่แนะนำ คือ การใช้งานพอดีที่โควตา หนึ่งหน่วยเหนือกว่า เกณฑ์อัตราส่วนที่ 0.8 และ 1.0 ตัวป้องกัน plan-mismatch การแข่งขัน CAS (การจองสองครั้งต่อพื้นที่ว่างหน่วยสุดท้าย) และการปฏิเสธเมื่อที่จัดเก็บขัดข้อง
  • คลาสโมเดลหลักพก @since 2.2.0; ซับสเตรตพก @since 2.3.0 สายแพ็กเกจปัจจุบันคือ 3.1.0
  • ผู้ดำเนินการเป็นเจ้าของการนำ repository สถานะการแจ้งเตือนและที่จัดเก็บการใช้งานไปใช้ ความคงทนของมันข้าม replica และการติดตั้งการแจ้งเตือนใหม่กลางรอบผ่าน clearAlerts()

หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต