Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Алгоритм работы с очередью на php
Форумы портала PHP.SU » » Вопросы новичков » Алгоритм работы с очередью на php

Страниц (1): [1]
 

1. avalon1981 - 29 Июня, 2015 - 08:42:03 - перейти к сообщению
Добрый день, уважаемые форумчане.

Очень нужен ваш профессиональный совет и конструктивная критика.

Пилим веб-сервис на php, в который будет делать отложенный постинг в аккаунты Вконтакте.

После авторизации в личный кабинет пользователь сможет добавлять так называемые задания, которые будет для него сервис выполнять. Задание представляет собой настройку действий - в какой аккаунт какую информацию постить и в какое время. Каждый пользователь системы может насоздавать ряд таких заданий.

Суть проблемы в следующем. Когда пользователей много и у каждого куча заданий, то мы в БД получаем большую очередь. Вопрос - как извлекать из нее задачи для выполнения?

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

Есть мысль брать задачи рандомно, что тоже имеет свои минусы т.к. теоретически какие-то задачи могут быть взяты в работу очень редко.

Может есть какое-то известное решение для задач такого рода?

Заранее спасибо за ответ!
2. Lansi - 29 Июня, 2015 - 10:33:44 - перейти к сообщению
Ну... тут можно в принципе делать подсчет задач из бд, например у кого наименьшее количество, того первым, и так до того, у которого больше всего задач, еще можно расчитать за какое время эти задачи будут сделаны до определенного клиента и выводить ему место в очереди, и сколько осталось ждать...

Ну или 2 вариант, пользователи сами будут решать задания других получая вознаграждение, за которое смогут сами создать задач, которые выполнят другие... А если вы хотите на этом заработать, то надо пофантазировать и вставить рекламу на сайт, чтобы пользователь перешел по ней без выбора...И сделать там услуги специальные, которые не могут выполнить другие уже за деньги
3. Мелкий - 29 Июня, 2015 - 11:28:25 - перейти к сообщению
Round-robin по user_id.
Что брать в качестве организации очереди конкретного аккаунта - fifo или что более интересное - никак не скажется на планировщике всей массы, задачи будут выдаваться равномерно.

Postgresql
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user_id, task, row_number() OVER (partition BY user_id ORDER BY task_priority) rr FROM queue WHERE /**/ ORDER BY rr, user_id;


Есть скользкое место - если выполнение только первого задания каждого пользователя будет уже длительной штукой (у меня для схожей задачи один таск был 5-10 минут штатно) - тогда система получается очень инертной. Пока обойдёт всех юзеров, текущая задача уже может быть удалена вовсе. А если не завершать обход юзеров - то первые юзера в очереди будут выполняться чаще.
Поэтому я бы не отсеивал на первом этапе уже выполненные задачи, а сделал как-то так:
CODE (SQL):
скопировать код в буфер обмена
  1. WITH tasks AS (
  2. SELECT user_id, task, row_number() OVER (partition BY user_id ORDER BY task_priority) rr FROM queue WHERE /*допустим, задачи, запланированные начиная со вчерашнего дня, но без проверки текущего статуса*/ ORDER BY rr, user_id
  3. )
  4. SELECT user_id, task FROM tasks WHERE /*а вот тут уже фильтруем только те, у которых статус "в очереди на выполнение"*/ LIMIT сколько_сейчас_свободно_воркеров;

Будет просеивать лишние записи, но вычитывать на приложение можно только задачи, требуемые прямо сейчас, что заметно улучшает инертность, и очередь будет выдаваться корректно.

 

Powered by ExBB FM 1.0 RC1