API 设计:我可以阻止用户进行极慢的查询吗?

Posted

技术标签:

【中文标题】API 设计:我可以阻止用户进行极慢的查询吗?【英文标题】:API design: can I stop users from making queries that are extremely slow? 【发布时间】:2014-02-25 14:48:54 【问题描述】:

我正在为基于 Postgres 数据库的 GeoDjango 应用程序构建 API。我有一个相当新手的问题。

我的 API 是 RESTful 且只读的 - 它只允许用户使用一些过滤器查询我的数据,并返回一些结果。

我的问题是这样的。我知道有一些查询可以通过 API 运行,这些查询的执行速度非常慢(例如大范围内的复杂地理查询 - 不过我确实希望允许用户在小范围内执行此操作) .

这些查询是否可能太慢而导致整个数据库崩溃? (我很确定我已经看到了这种情况。)如果可能的话,我能做些什么呢?

我是否应该限制通过 API 允许的查询类型?检查输入,只在小范围内执行查询?

或者(最好,因为我很难准确预测哪些查询会很慢)我可以在我的数据库上使用一个设置来在这些查询终止整个应用程序之前终止它们?

【问题讨论】:

【参考方案1】:

我认为 Django 或 geodjango 不提供任何支持杀死耗时过长的查询。

对 postgresql 文档的快速搜索给了我以下信息: http://www.postgresql.org/docs/9.3/static/runtime-config-client.html#GUC-STATEMENT-TIMEOUT

statement_timeout(整数)

中止任何花费超过指定毫秒数的语句,从命令到达服务器的时间开始 从客户端。如果 log_min_error_statement 设置为 ERROR 或更低, 超时的语句也将被记录。零值( 默认)将其关闭。

不建议在 postgresql.conf 中设置 statement_timeout,因为它会影响所有会话。

但这会影响所有查询,因此您可能会破坏由于某种原因需要更长时间的其他功能。

建议的方法是创建一个特殊用户,例如web_user,在运行这些查询并限制该用户时间的数据库上:

ALTER ROLE web_user SET statement_timeout = 10000;

【讨论】:

这是您目前最好的选择。 EU AXLE 项目 (axleproject.eu) 希望为 PostgreSQL 添加资源控制,让您限制给定用户使用的 I/O / CPU / RAM,但这最快要到 9.5 才会发生。【参考方案2】:

在 django 中,您可以像这样在 settings.py 中为 postgresql db 实现 statement_timeout(毫秒):

'default': 
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'dbname',
    'USER': 'username',
    'PASSWORD': '',
    'HOST': '',
    'PORT': '',
    'OPTIONS': 
        'options': '-c statement_timeout=1000'
    
,

【讨论】:

以上是关于API 设计:我可以阻止用户进行极慢的查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

查询阻止 CORS 的 API

在 Oracle 中运行速度极慢的 Postgres 查询

阻止使用静态生命周期创建对象

可以使用解析服务器进行*反向*关系查询吗?

阻止搜索引擎索引我的api

极慢的 Wordpress WooCommerce 网站(在管理面板和最终用户中)