【发布时间】:2021-10-04 04:50:24
【问题描述】:
我们开发了一个依赖于用户之间实时交互的网络应用。我们使用 Angular 作为前端,使用 Hasura 和 Postgres 上的 GraphQL 作为后端。
我们注意到,当超过 300 个用户同时处于活动状态时,我们会遇到严重的性能损失。
因此,我们希望改进我们的订阅设置。
我们认为可能的问题是:
- 订阅过多
- 订阅量太大且太复杂,订阅中的分叉太多
关于 1. 每个用户在使用网络应用程序时大约有 5-10 个订阅活动。关于 2. 我们的订阅很复杂,因为我们将最多 6 个表连接在一起。
我们想到的解决方案:
- 使用更多查询并限制在完全需要实时的字段上使用订阅。
- 将复杂的查询/订阅拆分为多个较小的查询/订阅。
我们是否错过了另一个可能的原因?我们还能用什么来提高整体性能?
感谢您的意见!
【问题讨论】:
-
这里没有包含任何关于 PostgreSQL 的内容,除了你正在使用它。如果您对深入研究 PostgreSQL 特定问题不感兴趣,例如记录慢速查询并对其执行
EXPLAIN (ANALYZE, BUFFER),您可能不应该使用 postgresql 标签。 -
我认为第一个是正确的。我遇到了什么:程序员做了很多繁重的订阅,所有需要的字段都绘制了一个网格。我们将逻辑分成几部分:a)仅订阅单个字段:更改日期,b)当应用程序看到该值发生更改时,它会运行 c)查询整个数据集。订阅注意事项:如果它有时返回误报也没关系 - 无论如何,最好在一分钟内对整个数据集进行一次或两次不需要的查询,然后每秒进行一次。在我们这样做之后:postgresql 实例的 CPU 使用率急剧下降
-
关于“订阅过多”:hasura 可以将多个订阅复用为一个 - 我个人不会指望这一点。我会做什么:我会尝试创建一个检测事实的函数:“某些东西可能发生了变化,最好重新查询所有数据”。假设您有 entityA、entityB、...、entityZ - 每个都可以更改。您可以创建单个订阅来检测“一个或所有实体中的数据已更改”这一事实并触发对 entityA-entityZ 的查询。单个订阅 -> 多个查询。
-
如果尝试剖析您的问题,找到一个简化的示例来说明它,然后将其添加到您的问题中,那就太好了
标签: postgresql graphql hasura graphql-subscriptions