postgresql - 管理数以万计的桌面应用程序用户访问 PostgreSQL 数据库的最佳解决方案

标签 postgresql concurrency database-connection roles

我想开发一个特定的应用程序,可用于访问在 PostgreSQL 中开发的数据库。该应用程序执行计算并向数据库服务器请求所需的数据。

如果用户已注册,则可以从网站下载该应用程序。启动应用程序后,用户必须登录才能使用它。 现在的问题是: 在这个例子中最明智的解决方案是什么? 老实说,我不想为每个用户创建单独的角色。 我的想法是该应用程序仅通过一般角色访问数据库,例如使用名称“usership”。通过此角色,用户仅具有明确定义的读取访问权限。用户可能还应该能够在某些表中以用户名保存自己的设置或测量值。然后,只能使用正确的用户名和密码进行访问,这些用户名和密码是在相关表上的每个操作中指定的(但是,对于具有一般数据的其他表的只读访问而言,不需要这样做)。

问题是,有多少个应用程序可以通过相同的数据库凭据/用户名“usership”同时与数据库进行通信是否有任何限制。

我不想为每个客户创建单独的数据库角色。不知何故,这对我来说似乎不太正确,因为添加新员工或删除他们意味着对数据库模式的重大干预(创建/删除角色)。基本上,应用程序除了一个多个用户同时登录的网站之外什么也不应该做,唯一的区别是应用程序不在浏览器中运行,一切都可以在应用程序级别的客户端或在客户端上运行。数据库服务器。

最佳答案

我不知道 postgres 中共享用户名+密码有任何限制。您可以使用相同的用户名+密码拥有数百或数千个并发连接。

数百或数千个并发连接可能出现问题,具体取决于您的数据库硬件,尤其是内存。

虽然 Postgres 理论上支持数千个并发连接,但实际上,随着打开连接数的增加,我遇到了内存问题。如果这是一个问题,并且很大一部分连接在任何时刻都处于空闲状态,则可以添加一层连接池,例如 pgbouncer ,但请记住,这会添加另一个要监视的进程。

但是,一般来说,我不推荐这种方法。您将提供对共享数据库的直接、本质上匿名的访问。我预计在客户端中保护您的数据库凭据会很困难,并且通过直接访问,构建会破坏数据库服务器的 SQL 查询应该相当容易。这将很难监控或防止,因为所有用户都是相同的,并且您无法在滥用情况下撤销访问权限(无需更改每个有权访问权限的人的密码)。

从安全角度来看,我绝对建议能够识别您的用户,单独监控他们的使用情况并单独撤销访问权限。我不知道拥有数千个单独的 postgres 用户/凭据会带来任何性能问题。

-- 可扩展性--

使用具有只读副本和负载平衡的 postgres 集群(例如 https://aws.amazon.com/premiumsupport/knowledge-center/requests-rds-read-replicas/ ),如果需要,您应该能够相当轻松地水平扩展。

关于postgresql - 管理数以万计的桌面应用程序用户访问 PostgreSQL 数据库的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69021527/

相关文章:

sql - 如何在postgres select中获取数字第一次出现的位置

c - 如何解决 Heroku 上的 "permission denied for language c"错误?

java - BlockingQueue 提供方法有时不会将项目添加到列表

pandas - 在 Pandas 中并发读取 HDF5 文件

php - 如何通过 Internet 将数据更新远程发送到托管的 MySQL 数据库?

sql - 删除 jsonb 中的所有空字符串值 | Postgres

postgresql - 常规 postgres 函数中的 OID 类型

java - 单例线程安全列表的实现

c# - 在 C# 中连接事物之前什么都不做的最佳方法

c++ - 如何通过C++连接到我的SQL数据库?