5 ms·
> 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?
by postgressomethi 5y ago
> 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?
- sa46 5y agoWhen 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.
- taffer 5y agoYou 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?
- sa46 5y agoYou 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.
- taffer 5y ago> [...] since network latency tends to dominate OLTP requests. You are absolutely right about that. However, in this case we are talking about background workers. I would argue that background workers, such as an image resizing worker, are typically CPU-bound and do not perform high-volume OLTP queries. Therefore, a background worker does not require multiple database connections per thread as a web server would.
- postgressomethi 5y ago> 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. But you only need one connection for LISTEN per database, total. So I'm confused why this is made out to be a big issue.