posts
- The Throughput Was Always 115
28 mock APIs. Twelve benchmark scenarios. Two codebases. One number: 115 req/s.
- Designed a Reactive Benchmark. Imperative Won.
Built a reactive benchmark with realistic latency. The imperative rewrite survived memory pressure. Reactive didn't.
- 265 req/s on All Three Runtimes (Until You Add a Memory Limit)
Native image, JVM, and virtual threads all hit 265 req/s. Then the memory limit dropped.
- ExecutorType.VIRTUAL Doesn't Exist
The Config Everyone Writes#micronaut: executors: io: type: VIRTUAL Every tutorial. Every "Micronaut + virtual threads" blog post. Every AI suggestion. This is the obvious config. One property, clean intent. It crashes at startup: No enum constant …
- Error Is Not Exception: Micrometer's Silent CPU Metric on Native Image
The catch block that catches nothing#This code has a bug. Not a typo, not a logic error. A type hierarchy bug. private double invoke(@Nullable Method method) { try { return method != null ? toDouble((Number) method.invoke(operatingSystemBean)) : Double.NaN; } …
- We Removed Reactor. Nothing Got Slower.
We took the entire reactive stack out. R2DBC, Mono, Flux, Reactor Core, loom-carrier, flatMap with its carefully-tuned concurrency arguments. Replaced it with JDBC, HikariCP, and blocking method calls. Same endpoints. Same Netty HTTP server. Same PostgreSQL. …
- Five Things Spring Boot 4.1 Doesn't Tell You Until It's Too Late
Spring Boot 3.5 lost OSS support on June 30, 2026. Boot 4 modularized autoconfiguration, and its silent failures cost an afternoon.
- Reactor to Mutiny: the operator phrasebook
A field translation guide from Project Reactor to SmallRye Mutiny, from a real 28-API port that compiled and ran.
- Loom Carrier on a Reactive Stack: 78 MB for Free
"Virtual threads don't help reactive apps." You've heard this. Probably said it. The reasoning is sound: a fully reactive stack — Mono/Flux from HTTP client through R2DBC to Netty — never blocks a platform thread. Virtual threads solve blocking. No blocking, …
- flatMap's Second Argument Saved 1.7 Million Requests
Midway through a code review of the reactive pipeline, staring at this line in NeoService.java: .flatMap(neo -> saveAsteroidWithApproaches(sessionId, neo)) That's Flux.flatMap() with one argument. The function. No concurrency limit. Reactor's default: 256 …