reactive
- The Flag Was Verified. The File Was Never Read.
Spring's process-aot writes its own native-image.properties over yours. A verified GraalVM flag sat in the repo for 43 days and never reached the build.
- Health 200, API 200, Prometheus 000
A GraalVM 25i4 bump made native /prometheus stop answering. The reflection gap was old; a new default turned a missing metric into a hang.
- The Falsifier That Never Fired
Spring should wedge at 256MB like Micronaut, or the r2dbc-pool theory is wrong. Ten hours later Spring wedged harder. Quarkus never noticed.
- Eight Connections, Zero Available
Two reactive frameworks hit the same 60 rps wall. The pool said all 8 connections were busy. Postgres said they were idle.
- Every Route Registered. Every Request 404'd.
A registered Micronaut route returning 404 under load. The route matched. The controller ran. Mono.zip ate the response.
- The numbers lied until we fixed the ports
Same reactive app on Micronaut, Spring Boot, and Quarkus. The numbers lied until we fixed the harness AND the ports.
- Two ways to mistranslate a retry
Porting @Retryable to Quarkus and Spring produced two silent retry bugs. One was a fix that broke parity. Both passed every test.
- 1% CPU and 6-Second Latency
A Quarkus reactive app hit 18.8 req/s while CPU idled at 1%. Two stacked bottlenecks — a transaction annotation and a connection pool default — explained the 5x gap with Spring.
- 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.