| Seeds / Sitemaps | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize and canonicalize a discovered URL before checking fast and durable dedupe. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of URL Normalizer. | 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 “Crawler trap generates infinite URL space” 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 Seeds / Sitemaps boundary before extracting or scaling it. |
| URL Normalizer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Place it in a per-host frontier ordered by priority and next allowed fetch time. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Seeds / Sitemaps from also owning the contract and failure behavior of Seen Bloom Filter. | 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 “Slow host holds worker resources” to Seeds / Sitemaps. | 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 URL Normalizer boundary before extracting or scaling it. |
| Seen Bloom Filter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: A politeness scheduler leases eligible URLs while enforcing robots and host concurrency. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents URL Normalizer from also owning the contract and failure behavior of Durable URL Set. | 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 “robots.txt changes during crawl” to URL Normalizer. | 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 Seen Bloom Filter boundary before extracting or scaling it. |
| Durable URL Set | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Fetch with strict size/type/time limits, persist raw content, parse links, and commit result. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Seen Bloom Filter from also owning the contract and failure behavior of Host Frontier. | 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 content has many URLs” to Seen Bloom Filter. | 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 Durable URL Set boundary before extracting or scaling it. |
| Host Frontier | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Score change frequency and importance to schedule the next crawl. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Durable URL Set from also owning the contract and failure behavior of Politeness Scheduler. | 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 “JavaScript renderer exhausts sandbox” to Durable URL Set. | 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 Host Frontier boundary before extracting or scaling it. |
| Politeness Scheduler | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize and canonicalize a discovered URL before checking fast and durable dedupe. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Host Frontier from also owning the contract and failure behavior of DNS Cache. | 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 “Crawler trap generates infinite URL space” to Host Frontier. | 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 Politeness Scheduler boundary before extracting or scaling it. |
| DNS Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Place it in a per-host frontier ordered by priority and next allowed fetch time. | Removes repeated work from the latency-critical path. It prevents Politeness Scheduler from also owning the contract and failure behavior of Fetcher Fleet. | 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 “Slow host holds worker resources” to Politeness Scheduler. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (10B URLs · 100K fetches/s · petabytes of content) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the DNS Cache boundary before extracting or scaling it. |
| Fetcher Fleet | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: A politeness scheduler leases eligible URLs while enforcing robots and host concurrency. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents DNS Cache from also owning the contract and failure behavior of Robots Cache. | 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 “robots.txt changes during crawl” to DNS 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 Fetcher Fleet boundary before extracting or scaling it. |
| Robots Cache | Serves a low-latency, disposable projection with authoritative fallback. In this design it participates in: Fetch with strict size/type/time limits, persist raw content, parse links, and commit result. | Removes repeated work from the latency-critical path. It prevents Fetcher Fleet from also owning the contract and failure behavior of Content 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 “Duplicate content has many URLs” to Fetcher Fleet. | Costs invalidation, staleness, stampede protection, and memory. Add or split it only after the workload (10B URLs · 100K fetches/s · petabytes of content) proves repeated reads dominate. Measure the latency, saturation, lag, or mismatch at the Robots Cache boundary before extracting or scaling it. |
| Content Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Score change frequency and importance to schedule the next crawl. | Defines the source of truth and commit boundary. It prevents Robots Cache from also owning the contract and failure behavior of Parser / Extractor. | 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 “JavaScript renderer exhausts sandbox” to Robots Cache. | 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 Content Store boundary before extracting or scaling it. |
| Parser / Extractor | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize and canonicalize a discovered URL before checking fast and durable dedupe. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Content Store from also owning the contract and failure behavior of Canonical Resolver. | 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 “Crawler trap generates infinite URL space” to Content 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 Parser / Extractor boundary before extracting or scaling it. |
| Canonical Resolver | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Place it in a per-host frontier ordered by priority and next allowed fetch time. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Parser / Extractor from also owning the contract and failure behavior of Link 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 “Slow host holds worker resources” to Parser / Extractor. | 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 Canonical Resolver boundary before extracting or scaling it. |
| Link Graph | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: A politeness scheduler leases eligible URLs while enforcing robots and host concurrency. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Canonical Resolver from also owning the contract and failure behavior of Recrawl Scorer. | 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 “robots.txt changes during crawl” to Canonical Resolver. | 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 Link Graph boundary before extracting or scaling it. |
| Recrawl Scorer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Fetch with strict size/type/time limits, persist raw content, parse links, and commit result. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Link Graph from also owning the contract and failure behavior of operators and repair tooling. | 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 content has many URLs” to Link Graph. | 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 Recrawl Scorer boundary before extracting or scaling it. |