Re: Optimize LISTEN/NOTIFY
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: "Joel Jacobson" <joel@compiler.org>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2025-10-02T16:39:39Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Optimize LISTEN/NOTIFY via shared channel map and direct advancement.
- 282b1cde9ded 19 (unreleased) landed
-
Fix incorrect logic for caching ResultRelInfos for triggers
- 39dcfda2d23a 19 (unreleased) cited
"Joel Jacobson" <joel@compiler.org> writes: > Thanks for reviewing. However, like said in my previous email, I'm > sorry, but don't believe in my suggested throughput/latency approach. I > unfortunately managed to derail from the IMO more promising approaches I > worked on initially. > What I couldn't find a solution to then, was the problem of possibly > ending up in a situation where some lagging backends would never catch > up. > In this new patch, I've simply introduced a new bgworker, given the > specific task of kicking lagging backends. I wish of course we could do > without the bgworker, but I don't see how that would be possible. I don't understand why you feel you need a bgworker. The existing code does not have any provision that guarantees a lost signal will eventually be re-sent --- it will be if there is continuing NOTIFY traffic, but not if all the senders suddenly go quiet. AFAIR we've had zero complaints about that in 25+ years. So I'm perfectly content to continue the approach of "check for laggards during NOTIFY". (This could be gated behind an overall check on how long the notify queue is, so that we don't expend the cycles when things are performing as-expected.) If you feel that that's not robust enough, you should split it out as a separate patch that's advertised as a robustness improvement not a performance improvement, and see if you can get anyone to bite. The other thing I'm concerned about with this patch is the new shared hash table. I don't think we have anywhere near a good enough fix on how big it needs to be, and that is problematic because of the frozen-at-startup size of main shared memory. We could imagine inventing YA GUC to let the user tell us how big to make it, but I think there is now a better way: use a dshash table (src/backend/lib/dshash.c). That offers the additional win that we don't have to create it at all in an installation that never uses LISTEN/NOTIFY. We could also rethink whether we really need the NOTIFY_MULTICAST_THRESHOLD limit: rather than having two code paths, we could just say that all listeners are registered for every channel. regards, tom lane