SOHIL LADHANI
  • Menu ▾
    • About
  • About

State Machines: Making Distributed Workflows Predictable

2026-02-28sohilladhani
#distributed-systems  #system-design  #architecture  #java  #patterns 

Boolean flags and status strings create impossible states. An explicit state machine tells you exactly where a workflow is, what transitions are valid, and how to recover.

[Read more]

Optimistic vs Pessimistic Concurrency: Locks vs Versions

2026-02-27sohilladhani
#distributed-systems  #database  #system-design  #java  #mysql 

Two users update the same row. Pessimistic locking blocks one until the other finishes. Optimistic locking lets both try and fails the loser. Choosing wrong kills either throughput or correctness.

[Read more]

Two-Phase Commit: The Original Distributed Transaction

2026-02-26sohilladhani
#distributed-systems  #system-design  #architecture  #java  #database 

Two-phase commit guarantees atomicity across multiple databases. It also blocks everything if the coordinator dies. Here’s why microservices moved on.

[Read more]

Input Validation and Abuse Prevention in Distributed Systems

2026-02-25sohilladhani
#security  #system-design  #architecture  #distributed-systems  #patterns 

Every public write endpoint is an abuse vector. Layered defense with validation, rate limiting, and async scanning keeps your system safe without killing performance.

[Read more]

Approximate Counting: HyperLogLog and Count-Min Sketch

2026-02-24sohilladhani
#distributed-systems  #data-structures  #system-design  #performance  #redis 

Counting unique items across billions of events. A HashSet needs gigabytes. HyperLogLog does it in 12KB. The trick is accepting a little error.

[Read more]

SLOs and Error Budgets: When Good Enough is a Number

2026-02-23sohilladhani
#observability  #system-design  #architecture  #distributed-systems  #performance 

100% availability is impossible and pursuing it wastes engineering time. SLOs turn reliability into a number you can reason about.

[Read more]

Base62 Encoding: Turning Numbers into Short Strings

2026-02-22sohilladhani
#system-design  #algorithms  #java  #architecture 

A 64-bit integer is 19 digits. Encode it in base62 and it’s 7 characters. The math behind compact, URL-safe identifiers.

[Read more]

Distributed ID Generation: Snowflake and Friends

2026-02-21sohilladhani
#distributed-systems  #system-design  #architecture  #java  #database 

Auto-increment IDs break the moment you have more than one database. Snowflake IDs, UUIDs, and database sequences each solve this differently.

[Read more]

Event Aggregation: When 47 Notifications Become One

2026-02-20sohilladhani
#distributed-systems  #system-design  #architecture  #patterns  #java 

Showing every individual event overwhelms users. Grouping related events into summaries is a distributed systems problem hiding as a UX problem.

[Read more]

Social Graphs at Scale: Storing Relationships in MySQL

2026-02-19sohilladhani
#mysql  #database  #system-design  #architecture  #performance 

A follows table with two columns seems trivial. Until you need to query it from both directions, across shards, for millions of users.

[Read more]

Relevance Scoring: Why Chronological Order Breaks Down

2026-02-18sohilladhani
#system-design  #architecture  #performance  #patterns  #algorithms 

Showing content in time order is simple until your users follow thousands of sources. Scoring and ranking turns a firehose into a useful stream.

[Read more]

Pre-Signed URLs: Uploading Files Without Touching Your Servers

2026-02-17sohilladhani
#system-design  #architecture  #performance  #java  #patterns 

Routing file uploads through your API server is a scaling bottleneck. Pre-signed URLs let clients upload directly to object storage.

[Read more]

Presence Systems: Who’s Online and How You Know

2026-02-16sohilladhani
#distributed-systems  #redis  #system-design  #architecture  #patterns 

Green dot means online. Simple, right? Behind that dot is a distributed system making heartbeat-based guesses about user liveness.

[Read more]

Cursor-Based Pagination: Why Offset Breaks at Scale

2026-02-15sohilladhani
#mysql  #database  #performance  #system-design  #java 

OFFSET 50000 makes MySQL scan 50,000 rows just to skip them. Cursor pagination stays fast no matter how deep you go.

[Read more]

Fan-Out Strategies: Write-Time vs Read-Time

2026-02-14sohilladhani
#distributed-systems  #system-design  #architecture  #performance  #patterns 

User posts an update. Do you push it to all followers immediately, or let them pull it when they check? The trade-off shapes your entire architecture.

[Read more]

WebSockets vs Long Polling: Choosing a Real-Time Transport

2026-02-13sohilladhani
#distributed-systems  #architecture  #java  #performance  #system-design 

Your client needs real-time updates from the server. HTTP wasn’t built for this. Here’s how long polling, SSE, and WebSockets solve it differently.

[Read more]

Read Replicas: Hidden Consistency Traps

2026-02-12sohilladhani
#mysql  #database  #replication  #consistency  #system-design 

You added read replicas to scale reads. Now users update their profile and see the old version. Welcome to replica lag.

[Read more]

Thundering Herd

2026-02-11sohilladhani
#distributed-systems  #caching  #performance  #system-design  #redis 

Cache expires. 10,000 requests hit the database simultaneously. Your DB collapses. How request coalescing and probabilistic expiration prevent the stampede.

[Read more]

Structured Logging in Distributed Systems

2026-02-10sohilladhani
#distributed-systems  #observability  #logging  #system-design  #java 

Grep through 50 log files to find one request. Or use structured logging with correlation IDs and find it in seconds.

[Read more]

Database Migrations Without Downtime

2026-02-09sohilladhani
#mysql  #database  #system-design  #deployment  #architecture 

ALTER TABLE on a 2M row table locks it for minutes. Your users see errors. Here’s how expand-contract and shadow writes let you migrate without downtime.

[Read more]

Tail Latency: The P99 Problem

2026-02-08sohilladhani
#distributed-systems  #performance  #system-design  #observability 

Your average latency looks great. Your P99 is a disaster. Why tail latency matters more than averages, and what you can actually do about it.

[Read more]

Ordering Guarantees in Event-Driven Systems

2026-02-07sohilladhani
#distributed-systems  #kafka  #messaging  #event-driven  #system-design 

Events arrive out of order. User updates overwrite each other. Here’s how partition keys, sequence numbers, and causal ordering keep things straight.

[Read more]

Dead Letter Queues

2026-02-06sohilladhani
#distributed-systems  #kafka  #messaging  #resilience  #system-design 

Your consumer retried a bad message 10,000 times. It will never succeed. Dead letter queues catch the messages that can’t be processed so the rest of your system keeps moving.

[Read more]

Making Consumers Idempotent

2026-02-05sohilladhani
#distributed-systems  #kafka  #messaging  #idempotency  #system-design  #java 

Exactly-once delivery is impossible across boundaries. Here’s the pattern that actually works: at-least-once delivery with idempotent consumers.

[Read more]

Exactly-Once Delivery is a Lie

2026-02-04sohilladhani
#distributed-systems  #kafka  #messaging  #idempotency  #system-design 

Kafka says exactly-once. Your consumer processed the message twice anyway. Here’s why exactly-once is impossible across system boundaries.

[Read more]

Graceful Shutdown: Dying Without Dropping Requests

2026-02-03sohilladhani
#kubernetes  #deployment  #resilience  #system-design  #spring-boot 

What happens to in-flight requests when you deploy? How to shut down cleanly without dropping connections or corrupting state.

[Read more]

Timeouts: The Hardest Easy Problem

2026-02-02sohilladhani
#distributed-systems  #timeouts  #resilience  #performance  #system-design 

Why setting timeouts is harder than it looks. Cascading failures, timeout budgets, and the art of picking the right number.

[Read more]

Distributed Locks: When One Process Must Win

2026-02-01sohilladhani
#distributed-systems  #redis  #locking  #concurrency  #system-design 

Why distributed locking is harder than it looks. Naive Redis locks, Redlock, fencing tokens, and when to avoid locks entirely.

[Read more]

Connection Pooling: Why Opening Connections Is Expensive

2026-01-31sohilladhani
#performance  #database  #connection-pooling  #java  #system-design 

The hidden cost of database connections. How connection pools work, why they matter, and how to size them without guessing.

[Read more]

Multi-Level Caching: L1, L2, and Beyond

2026-01-30sohilladhani
#caching  #performance  #redis  #cdn  #system-design  #architecture 

Why one cache isn’t enough. How to layer local, distributed, and CDN caches for maximum performance without losing your mind on consistency.

[Read more]
< [Newer posts] :: [Older posts] >
© 2026 by SOHIL LADHANI