用户连接限制作为并发限制措施?

时间:2019-06-17 15:15:27

标签: postgresql

我使用一个大型的postgres数据库执行大量任务(在云中的不同计算机上)。为了说明起见,每个任务将读取一些数据几秒钟(最多一分钟),然后处理它们几分钟。但是查询可能非常复杂,因此我绝对不希望它们同时运行100个。

理想情况下,我将在任务本身中围绕数据库访问逻辑实现一些分布式信号量,但是这些操作可能很棘手。我的问题是,我可以“简单方式”使用每个用户的postgres连接限制吗?例如,我为所有正在使用的用户设置了连接限制10,并在打开DB连接周围设置了简单的重试逻辑(有些睡眠)。当然,这是假定每个任务都使用短暂的连接(每次查询后关闭)来释放它们供其他工作人员使用。

我知道每个连接后端的内存开销都很小(大约5MB)。但是我没有发现有关频繁打开和关闭连接的开销的任何信息,甚至可能频繁拒绝连接。

2 个答案:

答案 0 :(得分:1)

您可以为此设置每个用户的连接限制,但我只会将其用作安全网。一直重试连接非常昂贵。

您应该使用连接池。那么连接池就是瓶颈,您不必重试连接,并且连接限制会自动得到遵守。

答案 1 :(得分:0)

受Laurenz答案的启发,我研究了连接池,这实际上是解决此问题的理想解决方案。我已经安装了pgBouncer,将pool_mode设置为statement(因为我的查询是简单的独立选择),并且将pool_size设置为所需的并发查询数。就像超级按钮一样工作,客户端中唯一需要的更改就是端口号的更改(它们连接到在同一台计算机上运行的pgBouncer而不是直接连接到DB)。 statement模式的唯一潜在问题是您不能使用search_path-您的查询需要在其中指定架构。