Pavan Rangani

Technical Blog

Original, in-depth articles from production trenches: Java, Spring Boot, Microservices, Apache Kafka, AWS, system design, and pragmatic AI integration in backend services. 363 articles published.

Asking for Permissions Without Getting Denied

August 18, 2026

Requesting a permission the instant your app opens is the fastest way to get it denied – and on mobile, a denial is often permanent. How to ask for runtime permissions with context and good timing, and how to handle a no… Read more

UUID or Auto-Increment: Choosing a Primary Key

August 18, 2026

Auto-increment integer or UUID for your primary key? It looks like a trivial choice made once and forgotten, but it quietly affects index performance, whether you leak your row counts, and how easily you can merge data a… Read more

CORS, Explained by What It Actually Blocks

August 18, 2026

No error confuses developers more than a CORS error, mostly because almost everything about it is counterintuitive: it is enforced by the browser not the server, it protects the user not your API, and disabling it is usu… Read more

Debounce vs Throttle: Which One, and When

August 18, 2026

Debounce and throttle are the two tools for taming events that fire too often – a search box firing on every keystroke, a scroll handler running hundreds of times a second. They sound similar and behave differently, and … Read more

Getting Reliable JSON Out of an LLM

August 18, 2026

The moment you want to use an LLM inside a program rather than a chat window, you need its output as structured data – and “please respond in JSON” plus hope is how you get 3am parse errors. The reliable ways… Read more

What a Health Check Should Actually Check

August 18, 2026

Most health check endpoints are one of two broken kinds: the one that returns 200 no matter what, and the one that checks so much a single slow dependency takes down every replica at once. The middle path is narrower tha… Read more

Building for the Subway: Offline-First Mobile Apps

August 18, 2026

Most apps are built as if the network always works, then break the moment a user walks into a tunnel. Offline-first flips the assumption: the network is unreliable by default. Local-first data, queued writes, and the con… Read more

Why Your App Takes Three Seconds to Open

August 18, 2026

The launch is the first thing a user experiences and the first thing they judge. What actually happens in the seconds between a tap and a usable screen, why almost all of it runs on one thread, and how to find the work t… Read more

Which Postgres Indexes You Actually Need

August 18, 2026

Indexes are the first thing people add for performance and the last thing they audit. Which index types actually earn their place, why the column order in a composite index decides everything, and how to find the indexes… Read more

Rate Limiting That Actually Stops Abuse

August 18, 2026

A naive request counter is easy to build and easy to bypass. The rate-limiting algorithms that actually work, why limiting by IP address quietly fails, and how to layer defenses so an attacker cannot simply route around … Read more

The JWT Mistakes Almost Everyone Makes

August 18, 2026

JSON Web Tokens are everywhere and misused almost everywhere. The predictable mistakes: storing them where XSS can steal them, assuming you can log someone out, algorithm confusion, and reaching for JWT when a session wo… Read more

You Might Not Need a State Management Library

August 18, 2026

Every React project reaches for a state library early, often before it needs one. The distinction that dissolves most of the problem: server state is not UI state, and most of what teams put in a global store is really a… Read more

The Web Form Nobody Gets Right

August 18, 2026

Forms are the most common interactive element on the web and the most consistently broken. Validation that fires at the wrong moment, errors a screen reader never announces, autofill sabotaged by clever markup. How to bu… Read more

Versioning an API Without Breaking Everyone

August 18, 2026

API versioning sounds like a URL-format debate, but the real problem is changing an API without breaking clients you do not control and cannot redeploy. What actually counts as a breaking change, and how to evolve an API… Read more

Caching: The Second Hard Problem

August 18, 2026

There are only two hard things in computer science, the joke goes, and cache invalidation is one of them. The caching patterns worth knowing, the staleness each one accepts, and the stampede that takes down services when… Read more

Where Your LLM Bill Actually Goes

August 18, 2026

The first LLM bill is a shock, and the instinct — switch to a cheaper model — is usually the wrong lever. Where the money actually goes: the asymmetry between input and output pricing, the context you resend every single… Read more

Using an LLM to Grade an LLM: The Traps

August 18, 2026

You cannot ship an LLM feature without measuring output quality, and hand-grading does not scale. Using an LLM as a judge works — if you know about position bias, self-preference, and the scores that quietly drift. A pra… Read more

Reading a Heap Dump After an OutOfMemoryError

August 18, 2026

A process dies with OutOfMemoryError and restarts, and it will happen again. Heap dump analysis tells you what filled the heap: how to capture the dump automatically at the moment of death, and how to read the dominator … Read more

The N+1 Query Problem: Why Your JPA App Is Slow

August 18, 2026

One page load fires 200 queries and nobody notices until production. The N+1 query problem hides behind clean-looking code. Here is how it happens, how to catch it, and the four fixes with their honest trade-offs.… Read more

Your Retry Logic Is Making the Outage Worse

July 23, 2026

A service slows down, every client retries, and the retries become the load that finishes it off. How retry storms form, why jitter matters more than backoff, and why retry budgets beat per-request limits.… Read more

A Decision Tree for Pods That Will Not Start

July 23, 2026

Pending, ImagePullBackOff, CrashLoopBackOff, CreateContainerConfigError, OOMKilled. Each status points at a different subsystem. A systematic walk through the ones you will actually hit, and the command that resolves eac… Read more

Stop Putting @Transactional on Every Service Method

July 23, 2026

Annotating every service method with @Transactional is cargo cult. It holds database connections longer than needed, hides the boundary that actually matters, and silently does nothing when called from inside the same cl… Read more

Qdrant Vector Database Production Deployment Guide

May 8, 2026

A field-tested guide to running Qdrant at scale: distributed mode with raft, scalar and binary quantization, payload indexing, hybrid search with sparse vectors, and the Kubernetes operator setup we shipped to production… Read more