How teams scaled Java: 5 real case studies

5 of the 94 engineering write-ups in our database mention Java in their stack. They come from 4 companies (Zalando, Canva, LinkedIn and Slack) and were published between 2016 and 2026. Techniques that show up most often alongside Java: caching (2), consistent hashing (2) and fan-out (2). It's often paired with Kubernetes (2) and RocksDB (2). 3 of the 5 state concrete scale numbers, for example "up to 200 MB/s on the old pipeline" (Zalando). Each card below links to our short summary and the original post.

Zalando · 2026

From Homegrown to Flink: Migrating a Stateful Ad Event Join at Scale

Zalando Marketing Services replaced a 7-year-old homegrown in-memory join that matched Sponsored Products auction bids to clicks/views within 15 minutes. The old Java service read up to 200 MB/s, could not partition both streams cleanly, and lost up to 15 minutes of state on every deploy or rescale. After Interval Join burned 15-30% CPU on RocksDB seeks and held a ~70M-entry timer queue, they rewrote the match with KeyedCoProcessFunction (point lookups, RocksDB TTL expiry), incremental 3-minute checkpoints, and two-way state. A four-week shadow pipeline hit 99.9% enrichment parity, then a one-week A/B test; average pods fell from 20 to about 5, memory from ~320 GB to ~100 GB, and EC2 cost from about €80 to €30 per day, with enrichment up ~0.5%.

up to 200 MB/s on the old pipelineaverage pods cut from a constant 20 to ~5 (range 1-8)stream joinscheckpointingkeyed stateApache FlinkRocksDBKubernetes
Canva · 2026

Session revocations at scale

Canva keeps 12 hours of session revocations in memory on every gateway, but hundreds of pods each loading over a million revocations from MySQL on deploy caused a stampede on the database. A worker now packs revocations into sorted 16-byte records in 30-minute chunks on S3, using conditional PUTs for optimistic concurrency and ZooKeeper leader election to avoid conflicts, and reaches over 2,000 revocations per second. Gateways binary-search the downloaded bytes directly and poll with conditional GETs, which shrank the cache by 87.5% and cut the revocation database down to two read replicas kept for redundancy.

hundreds of millions of usershundreds of thousands of session checks/seccachingobject storageoptimistic concurrency controlMySQLAmazon S3ZooKeeper
Zalando · 2026

Client-Side Load Balancing at a Million Requests Per Second

Zalando moved the internal fan-out of its Product Read API off the shared Skipper ingress into an in-process JVM load balancer that rebuilds the same xxHash64 consistent-hash ring. They added N-ring fade-in so new pods warm only the products they will keep, bounded load based on occupancy (Little's Law) weighted by latency, and a capped ring walk. Pods ran more evenly, the autoscaler target rose from 50% to 65% CPU, and the fleet shrank by over 25%.

1 million+ requests/sec moved off shared ingressup to 100 downstream calls per batchload balancingconsistent hashingcachingJavaKubernetesSkipper
Slack · 2023

Real-time Messaging

An overview of Slack's channel and gateway servers that fan messages out to millions of connected clients in real time.

pub/subconsistent hashingfan-outJavaWebSockets
LinkedIn · 2016

FollowFeed: LinkedIn's Feed Made Faster and Smarter

LinkedIn moved its feed to a fan-out-on-read system that keeps member timelines in memory and on RocksDB.

fan-out on readpartitioningrankingJavaRocksDB

Get new Java scaling stories weekly

One email a week. No spam.

Companies in these stories

Browse all 105 topics →