40 MB an hour: the Node memory leak hiding behind setMaxListeners(0)
A postmortem of a slow leak in a Node ingest service: how two heap snapshots, one retainer chain and a silenced warning led us to the bug.
A group engineering blog
Four developers writing about Postgres, Node, Go and the tooling around them. One post every two weeks or so, each one with code you can run and a fix we actually shipped.
Start here
A postmortem of a slow leak in a Node ingest service: how two heap snapshots, one retainer chain and a silenced warning led us to the bug.
Webhook providers deliver at least once, so your handler will see duplicates. A unique key and one transaction in Postgres make that harmless.
Three top-level folders, one dependency rule and pnpm filters for CI. The monorepo structure we keep coming back to, and what we stopped doing.
Width is time, height is call depth, colour means nothing. A practical guide to reading CPU flame graphs from Go's pprof, using a real regression we fixed.
ALTER TABLE ... RENAME COLUMN takes a millisecond and breaks every running pod. A step-by-step expand and contract rename in Postgres, with the trigger we use.
A date test that passed for months failed on a CI runner in Berlin. What we learned about DST, local midnight and testing code that reads the clock.
For most teams, feature flags are a Postgres table, a hashing function and a policy about expiry dates. Here is ours, and when we would pay for a product instead.
We added an index to fix a 1.2 second query and the plan did not change. Here is how EXPLAIN ANALYZE told us why, and the partial index that worked.
Exponential backoff without jitter turns one outage into synchronized waves of retries. Here is a small Go helper that gets backoff, jitter and cancellation right.