Back

Postgres LISTEN/NOTIFY actually scales

80 points2 hoursdbos.dev
jerf1 hour ago

"Scale" isn't a binary, it's a continuum. "Scales to 60K/s" can be 5 orders of magnitude more than one system needs and 5 orders of magnitude too small for another. Personally I'd knock the general "premature optimization" off the list of "most common developer errors" and put in its place "using techs with the wrong scaling factors". If you use something too small and you exceed its needs, the failure is obvious, but the other way around is a problem too. Bringing in the overhead and management issues of the super scalable techs, as well as their limitations they impose so that they can scale, to a system that would actually be better off with a richer model whose richness prevents it from scaling but would save a lot of effort is also a bad choice.

The ceiling of LISTEN/NOTIFY is small enough that you need to pay attention, and I personally like to have at least an order of magnitude of slack left over even after my most pessimistic load numbers are accounted for, but it's still plenty for a lot of projects, and the integration with the rest of the DB, its availability, its not being another service you have to devops, it's definitely not something that should be simply dismissed out of hand as an option. Even the original 2K/s number they cite is a lot of messages for some systems that are more properly measured in seconds per message.

zbentley1 hour ago

> 5 orders of magnitude too small for another.

Nitpick on an otherwise good post, but I don’t think there are very many 6billion RPS systems out there, and those that do exist are almost certainly using bespoke, purpose-built tools

odo124225 minutes ago

The highest I could think of is WhatsApp, which gets ~1.6 million RPS on average, and they use MQTT

jerf29 minutes ago

Fair.

dietr1ch2 hours ago

I recall that in the first release that supported LISTEN/NOTIFY there was a performance issue around it (poor locking IIRC), which today the "bad post" mentioned in here corrects in a errata just after their first paragraph.

Since the correction apparently dates from May 8th, I think that a post from July 24th might want to acknowledge that the popular post asserting this feature doesn't (didn't?) scale was not made in bad faith or was even wrong about their claims at the time.

KraftyOne30 minutes ago

If you mean the optimizations coming in Postgres 19, the original post addresses this:

> As an aside, there’s been some online discussion of a Postgres patch (https://github.com/postgres/postgres/commit/282b1cde9dedf456...) related to this issue. This patch (to be released in Postgres 19) does not remove the global lock or fix the bottleneck we observed. Instead, it optimizes the narrower case where there are many notification channels and each listener is waiting only on a specific channel.

nzoschke1 hour ago

I continue to love DBOS for how it just leverages Postgres (and now SQLite) properly. It's effortless to drop into an existing CRUD stack.

Once you start down the "durable workflows" path, you start seeing them everywhere.

My latest experiments are treating individual emails as durable workflows, where you, the people you're communicating with, agents and tools like GitHub or Attio all take turns in the flow.

https://housecat.com/blog/gmail-durable-workflows-sandbox-vm

Latty2 hours ago

One way it explicitly doesn't scale (unless something has changed since I last checked and my quick search failed me) is the hard limit on 8000 bytes of data in a notification. If your notification doesn't make sense to exist as a row (where you can just give an ID), then that makes it hard to use. I had a web game and the events were transient descriptions of changes in state that didn't make sense to store in the database, and could be bigger than that, so it didn't work for that use case.

dietr1ch1 hour ago

As an implementer of a scalable notification system I'd be sure to cap the notification size.

- Keeps messages O(1) so I can focus on scaling in the amount of notifications

- Tells whoever runs into this that,

    - I didn't planned for arbitrarily large messages as they *might* otherwise grind performance to a halt.
    - They *might* be misusing my notification system
jrochkind144 minutes ago

If I understnad right, they are saying it scales (to theri needs) with a custom patch to pg changing their semantics, right?

It does seem interesting, and possibly welcome if there were a configuration option or even a way to set individual notifies as serialized or not.

KraftyOne42 minutes ago

To be clear, it's not a custom patch to pg itself, but an application-side buffering and batching optimization.

mamcx46 minutes ago

Is the optimization only possible using dbos? is not clear to me if this mean a way to tune normal PG

acaloiar36 minutes ago

Much of the FUD around using LISTEN/NOTIFY in production comes from people who have never done so. It of course has its limits, and we should remain aware of them. Much like the limits of every piece of tech in our stacks.

Choose database queue technology https://news.ycombinator.com/item?id=37636841

David_runai23 minutes ago

[flagged]

zenith60527 minutes ago

[dead]