Backend & APIs

A Webhook With No Retry Policy Is a Notification You Will Never Receive

Webhooks are push notifications that depend on the receiver being available at the exact moment the event occurs, and a…

Read More »

Offset Pagination Breaks When the Data Changes Between Pages

Offset pagination is simple and works fine for static data, and it silently skips or duplicates records when the underlying…

Read More »

API Versioning Is a Deprecation Problem, Not a URL Problem

Choosing between /v1/ and a header is the easy decision. The hard part is getting clients off old versions, which…

Read More »

An Error Response That Does Not Say What to Do Is Not an Error Response

A client that receives an error with no indication of what went wrong or what to do about it is…

Read More »

An Operation That Takes Too Long to Do Synchronously Should Not Be Synchronous

When a request triggers work that takes longer than a client can reasonably wait, doing it synchronously ties up the…

Read More »

Most Real-Time Features Need Server-Sent Events, Not WebSockets

WebSockets provide full bidirectional communication. Most real-time features only need the server pushing updates to the client, which is a…

Read More »

Versioning an API in the URL Is the Most Honest Option, Not the Best One

URL versioning is the most visible and least subtle way to version an API, which is exactly why it is…

Read More »

A Single Rate Limit Bucket Lets One Bad Client Starve Everyone Else

Limiting total requests per second protects the server and does nothing to stop one misbehaving client from consuming the entire…

Read More »

GraphQL Solves a Problem You Might Not Have

GraphQL genuinely fixes over-fetching and client-driven data needs. It also brings the N+1 problem, unbounded query cost, and caching you…

Read More »

An Idempotency Key Is the Difference Between a Retry and a Duplicate Order

When a client retries a request because it timed out, the server cannot tell whether the original request actually succeeded,…

Read More »
Back to top button