Я реализовал себе подобный подход и рекомендую его вам. Я определил группы в Redshift WLM . Например, если пользователь БД принадлежит к одной указанной группе c, он может выполнять запросы без ограничения по времени, все другие запросы пользователя БД будут отменены через определенное время. Недостаток этого подхода заключается в том, что вам нужно будет настроить все вручную, включая максимальное количество параллельных запросов на группу. Но это должно быть сделано только один раз. Это файл конфигурации, созданный для наших целей:
[
{
"query_concurrency": 13,
"memory_percent_to_use": 87,
"query_group": [],
"query_group_wild_card": 0,
"user_group": [
"wlm_main"
],
"user_group_wild_card": 0
},
{
"query_concurrency": 2,
"max_execution_time": 300000,
"query_group": [],
"query_group_wild_card": 0,
"user_group": [],
"user_group_wild_card": 0
},
{
"short_query_queue": true
}
]
Он говорит, что пользователи, назначенные группе wlm_main , будут назначены в первую очередь. Все остальные будут назначены во вторую очередь, где параллельно может выполняться не более 2 запросов, все остальные ожидают в очереди. В дополнение к этому также используется ускорение коротких запросов . Как вы можете видеть - первая очередь не имеет ограничения по времени, вторая очередь имеет ограничение 300000 миллисекунд (5 минут).
Редактировать: Расширение ответа относительно этого конкретного c варианта использования.
Для получить pid (идентификатор процесса) запроса, отправленного в базу данных. Вы можете добавить комментарий перед оператором SQL с уникальным значением (ха sh или последовательность), например: /* d131dd02c5e6eec4 */ select ...
. И затем, основываясь на этом, вы можете найти его в stv_recents или stv_inflight и получить pid. После получения pid его можно использовать для завершения сеанса: pg_terminate_backend(pid)