У меня есть очередь для фотографий, которые люди загружают на мой сайт, поскольку в часы пик может быть загружено 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 процессов не смогут выбрать ни одного из них, пока этот первоначальный процесс не истечет …
Предложения, пожалуйста!
Спасибо
Задача ещё не решена.
Других решений пока нет …