zlacker

[return to "Do you really need Redis? How to get away with just PostgreSQL"]
1. pilif+p9[view] [source] 2021-06-12 08:43:02
>>hyzyla+(OP)
For pub/sub, I would recommend against using PostgreSQL if you're doing it at any kind of scale because LISTEN ties up one connection completely and Postgres connections are very expensive compared to a redis connection.
◧◩
2. postgr+O81[view] [source] 2021-06-12 18:51:47
>>pilif+p9
> LISTEN ties up one connection completely

I've seen this twice in this thread, but I don't know what that means. Can you explain a bit?

◧◩◪
3. sa46+Di1[view] [source] 2021-06-12 20:33:52
>>postgr+O81
When a client connects to Postgres, Postgres creates a new process just for that client. Separate processes are great for isolation but it means Postgres connections are a bit expensive (this is an active area of improvement). Postgres really starts to struggle once you a have a few thousand connections, even if those connections aren’t doing anything.

The common workaround is to use a connection pooler like PGBouncer so that clients reuse connections. This approach doesn’t work for LISTEN because typically a client will listen for its entire lifecycle so you can’t share connections in a pool.

◧◩◪◨
4. taffer+cp1[view] [source] 2021-06-12 21:41:51
>>sa46+Di1
You need one connection per worker thread, and realistically you would only have one worker per cpu core. So how many LISTENing connections do you really need?
◧◩◪◨⬒
5. sa46+Mv1[view] [source] 2021-06-12 22:49:10
>>taffer+cp1
You generally have more than one database connection per thread. As an example, consider Node.js which acts like a single threaded process. You’d probably want to be able to handle more than 1 database query concurrently since network latency tends to dominate OLTP requests.

How you setup LISTEN and NOTIFY is app dependent. In a multi-tenant database, you could have 1 NOTIFY channel per tenant.

As you scale, you probably do something that listens in a smarter way, maybe 1 Go channel per client with a single LISTEN instead of 1 database connection per client. The downside is that now the app code is responsible for tenant isolation instead of the database.

[go to top]