| Publisher SDK | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate consent, slot, context, and retrieve eligible campaign IDs from memory indexes. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Ad Gateway. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Hot campaign budget lease overspends” to the external caller. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Publisher SDK boundary before extracting or scaling it. |
| Ad Gateway | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Apply frequency caps and acquire approximate budget leases before ranking. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Publisher SDK from also owning the contract and failure behavior of Consent / Policy. | Put protocol, authentication, quotas, and business transitions in one process. Acceptable at low scale, but it couples external traffic risk to domain releases. Here that simpler choice would couple “Duplicate impression reaches billing” to Publisher SDK. | Costs another hop, policy distribution, and a high-blast-radius fleet. Introduce it when many clients or services need one protocol and protection boundary. Measure the latency, saturation, lag, or mismatch at the Ad Gateway boundary before extracting or scaling it. |
| Consent / Policy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Run auction/ranking, choose creative, and return signed impression metadata. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Ad Gateway from also owning the contract and failure behavior of Context Builder. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Creative is removed while cached” to Ad Gateway. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Consent / Policy boundary before extracting or scaling it. |
| Context Builder | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Ingest deduplicated impression/click events and update exact billing ledger. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Consent / Policy from also owning the contract and failure behavior of Eligibility Index. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Frequency cap store unavailable” to Consent / Policy. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Context Builder boundary before extracting or scaling it. |
| Eligibility Index | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Reconcile leases against ledger and feed fraud, attribution, and campaign reporting. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Context Builder from also owning the contract and failure behavior of Frequency Cap Store. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Fraud campaign generates synthetic clicks” to Context Builder. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1M requests/s · p99 < 80 ms · billions of campaigns) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Eligibility Index boundary before extracting or scaling it. |
| Frequency Cap Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Validate consent, slot, context, and retrieve eligible campaign IDs from memory indexes. | Defines the source of truth and commit boundary. It prevents Eligibility Index from also owning the contract and failure behavior of Budget Lease Cache. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Hot campaign budget lease overspends” to Eligibility Index. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Frequency Cap Store boundary before extracting or scaling it. |
| Budget Lease Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Apply frequency caps and acquire approximate budget leases before ranking. | Removes repeated work from the latency-critical path. It prevents Frequency Cap Store from also owning the contract and failure behavior of Pacing Service. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Duplicate impression reaches billing” to Frequency Cap Store. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1M requests/s · p99 < 80 ms · billions of campaigns) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Budget Lease Cache boundary before extracting or scaling it. |
| Pacing Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Run auction/ranking, choose creative, and return signed impression metadata. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Budget Lease Cache from also owning the contract and failure behavior of Candidate Retriever. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Creative is removed while cached” to Budget Lease Cache. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Pacing Service boundary before extracting or scaling it. |
| Candidate Retriever | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Ingest deduplicated impression/click events and update exact billing ledger. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Pacing Service from also owning the contract and failure behavior of Auction Ranker. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Frequency cap store unavailable” to Pacing Service. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Candidate Retriever boundary before extracting or scaling it. |
| Auction Ranker | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Reconcile leases against ledger and feed fraud, attribution, and campaign reporting. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Candidate Retriever from also owning the contract and failure behavior of Creative CDN. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Fraud campaign generates synthetic clicks” to Candidate Retriever. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Auction Ranker boundary before extracting or scaling it. |
| Creative CDN | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate consent, slot, context, and retrieve eligible campaign IDs from memory indexes. | Removes repeated work from the latency-critical path. It prevents Auction Ranker from also owning the contract and failure behavior of Impression Signer. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Hot campaign budget lease overspends” to Auction Ranker. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (1M requests/s · p99 < 80 ms · billions of campaigns) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Creative CDN boundary before extracting or scaling it. |
| Impression Signer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Apply frequency caps and acquire approximate budget leases before ranking. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Creative CDN from also owning the contract and failure behavior of Event Stream. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Duplicate impression reaches billing” to Creative CDN. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Impression Signer boundary before extracting or scaling it. |
| Event Stream | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Run auction/ranking, choose creative, and return signed impression metadata. | Decouples bursts and failure from user acknowledgment. It prevents Impression Signer from also owning the contract and failure behavior of Billing Ledger. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Creative is removed while cached” to Impression Signer. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Event Stream boundary before extracting or scaling it. |
| Billing Ledger | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Ingest deduplicated impression/click events and update exact billing ledger. | Defines the source of truth and commit boundary. It prevents Event Stream from also owning the contract and failure behavior of Fraud / Attribution. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Frequency cap store unavailable” to Event Stream. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Billing Ledger boundary before extracting or scaling it. |
| Fraud / Attribution | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Reconcile leases against ledger and feed fraud, attribution, and campaign reporting. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Billing Ledger from also owning the contract and failure behavior of operators and repair tooling. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Fraud campaign generates synthetic clicks” to Billing Ledger. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Fraud / Attribution boundary before extracting or scaling it. |