2014-02-09 2 views
0

У меня есть веб-приложение PHP, в котором база данных Postgres, которая получает много запросов, занимает второе место (300-600). Сервер базы данных не так эффективен, поэтому я получаю много запросов на тайм-ауты. Есть ли какой-либо механизм, который сделает очередь запросов перед запуском их в базе данных? Я вижу это как proccess/Deamon который принимает т.е. 50 запросов из очереди, запускает их на базу данных, ждет всех, чтобы закончить и получить следующие 50 запросов и т.д.Запросы базы данных PostgreSQL queue mechanizm (PHP)

ответ

3

Есть ли какой-либо механизм, который бы сделать запросы очереди перед запуском их на базе

Да - PgBouncer в сделки режим может стоять в очереди заявлений регулированием количества.

Очень вероятно, что вам, вероятно, просто нужно настроить сервер БД и работать с плохо выполняющими запросы. Проверьте pg_stat_statements, auto_explain, explain analyze и т. Д. Прочитайте the wiki article on connection counts и slow queries.

Если возможно, исправьте свое клиентское приложение, чтобы оно делало меньше запросов, которые каждый из них больше работает - выполните операции с настройками.

Для записи (вставка/обновление/удаление) пакет в транзакции и, если возможно, запускайте меньше операторов, которые выполняют больше работы. В частности, не следует, если это возможно, циклически выполнять оператор SQL.

Если вы должны использовать большое количество мелких записей, посмотрите на установку commit_delay или (если вы можете принять окно с потерей данных) значение synchronous_commit = off для менее важных записей.

Если ваши запросы в основном читаются, я настоятельно рекомендую ввести кэш среднего уровня, такой как хранилище ключей/значений Redis в памяти или Memcached. Попросите ваше приложение управлять этим кешем, чтобы избежать многократного сбора данных, которые не должны быть совершенно свежими, или не очень быстро меняются. Вы можете использовать функции LISTEN и NOTIFY PostgreSQL для реализации мелкомасштабной недействительности кеша.

+0

Спасибо за ответ. Я только что нашел это: http://kr.github.io/beanstalkd/ Кто-нибудь использовал его для очереди запросов к базе данных? Это хорошая идея? Документация довольно плохая. –

+0

@ZiomZiomalski Если вы ищете реальную систему очередей, для очередей сообщений посмотрите на ZeroMQ, ActiveMQ, Celery и т. Д. И т. Д. И т. Д. Не так уверен в очередях задач, мне не нужно иметь дело с ними, но см. Http: //queues.io/. Также читайте http://mikehadlow.blogspot.com.au/2012/04/database-as-queue-anti-pattern.html. –

+0

@ZiomZiomalski Кроме того, рассмотрите вопрос о создании нового вопроса, который лучше всего обрамлен: «Вот что делает мое приложение, вот запросы, которые он запускает, вот почему он делает это, вот проблема производительности, которую он вызывает, есть ли лучший способ?». Включите версию PostgreSQL, ключевые параметры, такие как 'max_connections', описание задачи, которую выполняет ваше приложение, как эта задача запускается, что вы делаете с результатом и т. Д. –