GDPR Deletion in Event-Driven Systems
Deleting a user across many services is a fan-out problem with a nasty twist: what your deletion event means. Requested or executed changes everything.
Topic hub
Consensus protocols, replication, partitioning, consistency models, and the failure modes that only show up at scale.
19 articles
Deleting a user across many services is a fan-out problem with a nasty twist: what your deletion event means. Requested or executed changes everything.
Three Kafka settings decide throughput, cost, and whether replay works: partition count, retention, and cleanup policy. How to choose each deliberately.
Ad-hoc Kafka topics become an unnavigable mess. A naming convention plus a single canonical registry keeps an event bus legible as it grows past 50 topics.
Writing to your database and publishing an event are two operations that can't share a transaction. The outbox pattern fixes that, and when to skip it.
Designing leaderboards at scale: why a sorted database query dies under load, how a Redis sorted set fixes it, and how to shard ranking past one node.
Notification fanout comes down to fan-out-on-write vs on-read, and the celebrity problem that breaks the naive choice. The hybrid design that scales, explained.
Backpressure keeps real-time systems alive under load by making producers slow down instead of drowning consumers. Strategies, tradeoffs, and a checklist.
A timeout budget is one deadline split across a service chain so the whole request fails fast instead of piling up doomed work. How to set and propagate it.
Idempotency keys make retried requests safe so a timed-out payment or duplicate POST applies exactly once. The design, storage, and TTL decisions that matter.
Pick database sharding strategies before traffic forces your hand. Shard keys, hash vs range vs directory, online resharding, and the traps that bite early.
Replaying a Kafka topic re-delivers events, so duplicates are guaranteed unless consumers are idempotent. The safe replay playbook: dedup, offsets, and isolation.
Plain-text logs are ungreppable at scale. Structured logging makes logs queryable, but volume and cost bite back. How to log structured, useful, and affordable.
Tracing everything is too expensive; tracing 1% randomly drops the traces you need. OpenTelemetry sampling strategies, head vs tail, and how to choose.
High-cardinality labels are what kill Prometheus, not query volume. What causes a cardinality explosion, how to spot it, and the label rules that prevent it.
Jaeger turns a slow request across many services into one visual trace. How distributed tracing works, what to instrument, and the sampling tradeoff that bites.
Protobuf schema evolution has clear rules: keep field numbers stable, reserve removals, add not mutate. The safe-vs-breaking change cheat sheet and why.
gRPC across languages promises neutral RPC. In production the gaps are real: load balancing, deadlines, status codes, and schema evolution. The fixes.
Rust hot path services hold their latency target only if you set 4 defaults right: panic strategy, allocator, Tokio runtime, and bounds. The production checklist.
Go vs Rust for microservices: use Go by default, reach for Rust only on hot paths where tail latency or memory is a measured need. The decision framework.