Как сохранить очередь с параллельной обработкой, если в ней не так много?

У меня есть очередь для фотографий, которые люди загружают на мой сайт, поскольку в часы пик может быть загружено 10 000 или более фотографий в час.

Мой скрипт php вызывается через cron каждую минуту и ​​выбирает фотографии из базы данных с предложением where FLOOR(photoId / 100) % $digit, где $digit = $counter % 10;

Поэтому на первой минуте обрабатываются фотографии с идентификаторами, соответствующими xxxx0xx, затем на следующей минуте фотографии с идентификаторами xxxx1xx, затем xxxx2xx и т. Д. LIMIT 0, 1000 запрос, и пусть он попытается сделать столько, сколько может, прежде чем я его тайм-аут.

У меня 6-ядерный HT xeon, и я обычно оставляю эти процессы запущенными в течение 6 минут.

Когда я запускаю процесс, я запускаю его через ionice а также nice и если среднее значение за 1 минуту нагрузки для сервера выше 6, я прекращаю работу. Если нет, я увеличиваю $counter и продолжай.

Похоже, это довольно хороший баланс для выполнения многих задач без чрезмерного снижения производительности сайта (все находится на одном выделенном сервере).

Почему я делаю FLOOR(photoId / 100) а не просто photoId? Хорошо, что люди загружают много пакетных фотографий (то есть быстрый набор снимков), и это лучше работает на сайте, чтобы все они появлялись одновременно. Это не всегда сделать это, но это будет довольно близко и гораздо лучше, чем просто моддинг photoId,

Когда очередь занята и загружается много людей, это работает очень хорошо.

Но в спокойное время, когда всего один фотограф загружает всего несколько десятков фотографий, им может «не повезти», и очередь может занять 10 минут, чтобы обработать свои идентификаторы.

Что было бы лучшим способом смягчить это? Неужели моя идея об этой очереди — это чепуха, и я должен что-то сделать лучше?

Вместо всей техники% я мог бы просто выбрать первые 1000 идентификаторов, которые не помечены как «обрабатываемые».

Затем я отмечаю их как «обрабатываемые» в базе данных, чтобы следующий процесс не выбрал их. Сделайте как можно больше, а затем снимите отметку с остальных, чтобы их можно было снова выбрать. Но тогда, если в очереди меньше 1000, следующие 5 процессов не смогут выбрать ни одного из них, пока этот первоначальный процесс не истечет …

Предложения, пожалуйста!

Спасибо

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]