| Mobile Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Commit the post and emit one immutable post-created event. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Feed API. | 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 “Celebrity post creates billion-edge fan-out” 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 Mobile Client boundary before extracting or scaling it. |
| Feed API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Fan out ordinary authors into follower timeline partitions; mark celebrities pull-on-read. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Mobile Client from also owning the contract and failure behavior of Auth / 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 “Feed cursor sees inserts between pages” to Mobile Client. | 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 Feed API boundary before extracting or scaling it. |
| Auth / Policy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: At read, merge materialized timeline, celebrity candidates, and eligible ads. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Feed API from also owning the contract and failure behavior of Candidate Service. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Deleted private post remains cached” to Feed API. | 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 Auth / Policy boundary before extracting or scaling it. |
| Candidate Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Filter privacy/deletes, fetch features, rank a bounded candidate set, and paginate by cursor. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auth / Policy from also owning the contract and failure behavior of Social Graph. | 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 “Ranking service exceeds latency budget” to Auth / 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 Candidate Service boundary before extracting or scaling it. |
| Social Graph | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Log impressions asynchronously with model and candidate-set versions. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Candidate Service from also owning the contract and failure behavior of Post Store. | 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 “Fanout lag causes stale timelines” to Candidate 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 Social Graph boundary before extracting or scaling it. |
| Post Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Commit the post and emit one immutable post-created event. | Defines the source of truth and commit boundary. It prevents Social Graph from also owning the contract and failure behavior of Fanout Router. | 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 “Celebrity post creates billion-edge fan-out” to Social Graph. | 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 Post Store boundary before extracting or scaling it. |
| Fanout Router | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: Fan out ordinary authors into follower timeline partitions; mark celebrities pull-on-read. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Post Store from also owning the contract and failure behavior of Timeline Workers. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “Feed cursor sees inserts between pages” to Post Store. | Costs leases, checkpoints, retries, DLQs, and lag operations. Separate once execution time or burstiness no longer fits the request deadline. Measure the latency, saturation, lag, or mismatch at the Fanout Router boundary before extracting or scaling it. |
| Timeline Workers | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: At read, merge materialized timeline, celebrity candidates, and eligible ads. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Fanout Router from also owning the contract and failure behavior of Timeline Cache. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “Deleted private post remains cached” to Fanout Router. | Costs leases, checkpoints, retries, DLQs, and lag operations. Separate once execution time or burstiness no longer fits the request deadline. Measure the latency, saturation, lag, or mismatch at the Timeline Workers boundary before extracting or scaling it. |
| Timeline Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Filter privacy/deletes, fetch features, rank a bounded candidate set, and paginate by cursor. | Removes repeated work from the latency-critical path. It prevents Timeline Workers from also owning the contract and failure behavior of Celebrity Pull Path. | 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 “Ranking service exceeds latency budget” to Timeline Workers. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (500M users · 100K feed reads/s · 20K posts/s) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Timeline Cache boundary before extracting or scaling it. |
| Celebrity Pull Path | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Log impressions asynchronously with model and candidate-set versions. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Timeline Cache from also owning the contract and failure behavior of Ranking Service. | 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 “Fanout lag causes stale timelines” to Timeline 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 Celebrity Pull Path boundary before extracting or scaling it. |
| Ranking Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Commit the post and emit one immutable post-created event. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Celebrity Pull Path from also owning the contract and failure behavior of Feature Store. | 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 “Celebrity post creates billion-edge fan-out” to Celebrity Pull Path. | 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 Ranking Service boundary before extracting or scaling it. |
| Feature Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Fan out ordinary authors into follower timeline partitions; mark celebrities pull-on-read. | Defines the source of truth and commit boundary. It prevents Ranking Service from also owning the contract and failure behavior of Ads Mixer. | 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 “Feed cursor sees inserts between pages” to Ranking Service. | 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 Feature Store boundary before extracting or scaling it. |
| Ads Mixer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: At read, merge materialized timeline, celebrity candidates, and eligible ads. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Feature Store from also owning the contract and failure behavior of Impression 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 “Deleted private post remains cached” to Feature Store. | 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 Ads Mixer boundary before extracting or scaling it. |
| Impression Stream | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Filter privacy/deletes, fetch features, rank a bounded candidate set, and paginate by cursor. | Decouples bursts and failure from user acknowledgment. It prevents Ads Mixer from also owning the contract and failure behavior of operators and repair tooling. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Ranking service exceeds latency budget” to Ads Mixer. | 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 Impression Stream boundary before extracting or scaling it. |