Как я могу ограничить время запроса базы данных во время веб-запросов? - PullRequest
8 голосов
/ 24 марта 2011

У нас есть довольно типичное приложение django, работающее на postgresql 9.0.Недавно мы обнаружили несколько запросов к базе данных, которые выполнялись более 4 часов из-за неэффективного поиска в интерфейсе администратора.Хотя мы планируем исправить эти запросы, в качестве меры предосторожности мы хотели бы искусственно ограничить время запроса к базе данных до 15 секунд - но только в контексте веб-запроса;пакетные задания и задачи сельдерея не должны ограничиваться этим ограничением.

Как мы можем это сделать?Или это ужасная идея?

Ответы [ 3 ]

21 голосов
/ 24 марта 2011

Лучший способ сделать это - настроить роль / пользователя, который используется только для запуска веб-запросов, а затем установить для этой роли Statement_timeout.

ALTER ROLE role_name SET statement_timeout = 15000

Все остальные роли будутглобальная настройка Statement_timeout (которая отключена в стандартной установке).

0 голосов
/ 24 марта 2011

Вам нужно будет обработать это вручную.Это проверяет правило 15 секунд и убивает запросы, которые его нарушают.

Запрос pg_stat_activity, поиск нарушителей и вызов pg_terminate_backend (procpid) для убийства нарушителей.

Что-то вроде этогов цикле:

SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB'
  AND usename = 'WEBUSERNAME'
  AND (now()-query_start) > '00:00:15';
0 голосов
/ 24 марта 2011

Что касается времени, вы можете передавать все свои запросы через класс, который при создании создает два потока: один для запроса и один для таймера.Если таймер достигнет 15 секунд, убейте поток с помощью запроса.

Что касается выяснения, был ли создан запрос из веб-запроса, я недостаточно знаю о Django, чтобы помочь вам,Проще говоря, я бы сказал, что в вашем классе, который обрабатывает вызовы вашей базы данных, необязательным параметром для конструктора может быть что-то вроде context, которое может быть http в случае веб-запроса и "" для всего остального.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...