正在加载内容...

963963 Chat Wiki Portal Independent coverage of news

Content Delivery in Practice: Lessons From Real Deployments

By David Kim · · 1238 words
Content Delivery in Practice: Lessons From Real Deployments

You can often replace a coordination problem with an idempotency key. That applies to content delivery as well. In practice, content delivery behaves differently: Anything that grows without a bound will eventually hit one. Documentation that is not tested tends to describe the previous version. The same reasoning holds for content delivery.

Routine sexual-health screening is a preventive check for sexually transmitted infections (STIs), often offered to people who have no symptoms. It may include a discussion of sexual history and one or more tests, but there is no single panel used everywhere. The tests recommended depend on a person’s health, the kinds of sexual contact they have had, timing, pregnancy status and local guidance.

For release process, the constraint matters more than the feature list. Configurations should be reviewable in a diff, not only in a console. Teams working on release process usually discover this the hard way. The best time to add an index is before the table gets large. Failures are usually correlated, so plan for the shared dependency. This is most visible in release process.

Crawl Budget: A queue smooths spikes but also hides how far behind you are. Retries without jitter turn a small outage into a large one. That applies to crawl budget as well. In practice, crawl budget behaves differently: Separating the reads from the writes buys room to change either side.

Consider edge caching specifically. Serving static bytes is the cheapest thing you can do at the edge. Edge Caching: A schema is an interface; changing it is a migration, not an edit. Track the denominator as carefully as the numerator. That applies to edge caching as well.

Consider cost controls specifically. You can often replace a coordination problem with an idempotency key. Cost Controls: Anything that grows without a bound will eventually hit one. Documentation that is not tested tends to describe the previous version. That applies to cost controls as well.

Teams working on rate limiting usually discover this the hard way. Serving static bytes is the cheapest thing you can do at the edge. A schema is an interface; changing it is a migration, not an edit. This is most visible in rate limiting. Consider rate limiting specifically. Track the denominator as carefully as the numerator.

In practice, search indexing behaves differently: The first thing to settle is the failure mode, not the happy path. Measurements taken once are anecdotes; you need a baseline that repeats. The same reasoning holds for search indexing. For search indexing, the constraint matters more than the feature list. Costs usually concentrate in a small number of operations, so find those first.

Talking about boundaries can make expectations clearer in a relationship, including around physical contact, sex, privacy and communication. A useful conversation is specific and voluntary: each person can say what feels acceptable, ask questions and change their mind without being pressured.

Data Pipelines: Periodic jobs should be safe to run twice, because they will be. Data Pipelines: You rarely need a new component to fix a boundary problem. Data Pipelines: The signal you want is often already logged, just not aggregated.

API Design: You can often replace a coordination problem with an idempotency key. API Design: Anything that grows without a bound will eventually hit one. API Design: Documentation that is not tested tends to describe the previous version.

Teams working on storage tiers usually discover this the hard way. The interesting number is not the average, it is the 99th percentile. Adding a cache in front of a slow query is a fix; fixing the query is a cure. This is most visible in storage tiers. Consider storage tiers specifically. Every abstraction you add is a place where behaviour can differ from intent.

Search Indexing: A design that cannot be rolled back is a design that cannot be changed safely. Search Indexing: Latency budgets are easier to defend when every hop has a stated ceiling. Search Indexing: Caching helps only until the invalidation rules become the bottleneck.

Access Control: Configurations should be reviewable in a diff, not only in a console. Access Control: The best time to add an index is before the table gets large. Access Control: Failures are usually correlated, so plan for the shared dependency.

A design that cannot be rolled back is a design that cannot be changed safely. The same reasoning holds for cloud infrastructure. For cloud infrastructure, the constraint matters more than the feature list. Latency budgets are easier to defend when every hop has a stated ceiling. Teams working on cloud infrastructure usually discover this the hard way. Caching helps only until the invalidation rules become the bottleneck.

You can often replace a coordination problem with an idempotency key. The same reasoning holds for log analysis. For log analysis, the constraint matters more than the feature list. Anything that grows without a bound will eventually hit one. Teams working on log analysis usually discover this the hard way. Documentation that is not tested tends to describe the previous version.

Monitoring Alerts: The interesting number is not the average, it is the 99th percentile. Monitoring Alerts: Adding a cache in front of a slow query is a fix; fixing the query is a cure. Monitoring Alerts: Every abstraction you add is a place where behaviour can differ from intent.

Access Control: A queue smooths spikes but also hides how far behind you are. Access Control: Retries without jitter turn a small outage into a large one. Access Control: Separating the reads from the writes buys room to change either side.

Serving static bytes is the cheapest thing you can do at the edge. The same reasoning holds for content delivery. For content delivery, the constraint matters more than the feature list. A schema is an interface; changing it is a migration, not an edit. Teams working on content delivery usually discover this the hard way. Track the denominator as carefully as the numerator.

Monitoring Alerts: A queue smooths spikes but also hides how far behind you are. Monitoring Alerts: Retries without jitter turn a small outage into a large one. Monitoring Alerts: Separating the reads from the writes buys room to change either side.

Cloud Infrastructure: If the rollback plan needs a meeting, it is not a rollback plan. Cloud Infrastructure: Small pages that stay small are easier to keep fast than large ones made fast. Cloud Infrastructure: Write the invariant down; otherwise it lives only in someone's memory.

For data pipelines, the constraint matters more than the feature list. If a metric has no owner, it will drift until it causes an incident. Teams working on data pipelines usually discover this the hard way. The cheapest optimisation is usually removing work nobody asked for. Aggregating at write time trades flexibility for predictable read cost. This is most visible in data pipelines.

Consider cloud infrastructure specifically. The interesting number is not the average, it is the 99th percentile. Cloud Infrastructure: Adding a cache in front of a slow query is a fix; fixing the query is a cure. Every abstraction you add is a place where behaviour can differ from intent. That applies to cloud infrastructure as well.

Crawl Budget: If the rollback plan needs a meeting, it is not a rollback plan. Crawl Budget: Small pages that stay small are easier to keep fast than large ones made fast. Crawl Budget: Write the invariant down; otherwise it lives only in someone's memory.

Related reading