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

时间:2014-02-01 23:20:39

标签: django postgresql geodjango

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

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

我的问题是这个。我知道有一些查询可以通过API执行,执行速度极慢(例如大面积的复杂地理查询 - 我确实希望允许用户在一小块区域内执行此操作) 。

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

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

或者(最好,因为我很难准确地预测哪些查询会很慢)我可以在我的数据库上使用一个设置来杀死这些查询,然后再杀死整个应用程序?

2 个答案:

答案 0 :(得分:2)

我认为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;

答案 1 :(得分:0)

在django中,您可以在statement_timeout中为postgresql数据库实现settings.py(毫秒),如下所示:

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