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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Алгоритм работы с очередью на php

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
avalon1981
Отправлено: 29 Июня, 2015 - 08:42:03
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июнь 2015  


Помог: 0 раз(а)




Добрый день, уважаемые форумчане.

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

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

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

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

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

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

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

Заранее спасибо за ответ!
 
 Top
Lansi
Отправлено: 29 Июня, 2015 - 10:33:44
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Июнь 2015  


Помог: 0 раз(а)




Ну... тут можно в принципе делать подсчет задач из бд, например у кого наименьшее количество, того первым, и так до того, у которого больше всего задач, еще можно расчитать за какое время эти задачи будут сделаны до определенного клиента и выводить ему место в очереди, и сколько осталось ждать...

Ну или 2 вариант, пользователи сами будут решать задания других получая вознаграждение, за которое смогут сами создать задач, которые выполнят другие... А если вы хотите на этом заработать, то надо пофантазировать и вставить рекламу на сайт, чтобы пользователь перешел по ней без выбора...И сделать там услуги специальные, которые не могут выполнить другие уже за деньги
 
 Top
Мелкий Супермодератор
Отправлено: 29 Июня, 2015 - 11:28:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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 сколько_сейчас_свободно_воркеров;

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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB