2016-07-18 5 views
0

То, что я пытаюсь создать, - это система, которая читает/анализирует данные из более чем дюжины внешних веб-сайтов.Работа, которая начинается после завершения?

В качестве примера предположим, что я хочу создать систему, которая анализирует сообщения Twitter на странице профиля конкретного пользователя. Я хочу сделать это более десятка пользователей.

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

Когда задание закончено (т.е. когда оно разобрало все сообщения пользователя на странице), мне нужно, чтобы работа начиналась заново (чтобы разобрать любые новые сообщения).

Итак, в конце, если есть 12 пользователей, у меня должно быть 12 заданий, которые постоянно работают, которые анализируют любые новые сообщения, сделанные одним из этих 12 пользователей.

Насколько я знаю, есть два способа сделать это. Первый - использовать cron jobs, второй - использовать Laravel's queuing system.

Каков наилучший способ решить эту проблему? Cron заданий или очередей? Как бы я его правильно реализовать?

С заданиями cron две проблемы, о которых я могу думать, это то, что клоны работают по времени, а не на основе завершения работы, а это означает, что если работа завершена, ей придется подождать, пока задание cron будет вызвано снова (например, каждые 5 минут). Другая проблема - перекрытие. Что делать, если работа не завершается вовремя, но cron снова вызывает задание?

Это то, что упрощенная версия моей текущей реализации очереди заданий выглядит, однако, я заметил, что мое использование CPU переходит к между 75-90%:

<?php 

namespace App\Jobs; 

use App\Jobs\Job; 
use Illuminate\Contracts\Mail\Mailer; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 

use App\Models\Page; 

class PageParser extends Job implements ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 

    protected $page; 

    public function __construct(Page $page) 
    { 
     $this->page = $page; 
    } 

    public function handle() 
    { 
     // Parsing done here, removed for simplicity 

     $this->delete(); 
     dispatch(new PageParser($this->page)); 
    } 
} 
+0

Вы действительно ищете сообщения в Twitter? Если это так, вы должны посмотреть на их потоковые конечные точки.Создание бесконечной работы было бы довольно просто, используя цикл while, основанный на состоянии соединения. – ExoticChimp

+0

Нет, я не ищу сообщения в Twitter. Мой пример был упрощением общей идеи. – user6605184

ответ

0

Я не пробовал это, но Я бы предположил, что вы можете создать рекурсивную работу.

Эта рекурсивная работа будет выполнять весь необходимый код, а затем в конце выполнения она создаст новое задание и вытолкнет его в очередь, которая затем начнет работать, как только очередь будет готова для Это.

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

0

Вы можете использовать комбинацию. Создайте команду, например «RetrieveDataCommand» или что-то еще. Эта команда должна запускать задание в очередь для каждого пользователя, который будет извлекать данные для этого пользователя (и, возможно, отдельное задание для фактической обработки, если это необходимо?). Задача должна учитывать параметр «$ from», который является отметкой времени, если при выполнении предыдущей команды. Когда он запускается, он извлекает все данные для всех пользователей за период времени от $ до now().

После этого вы можете выполнить задание cron каждые 10 секунд или что-то еще. $ From можно либо вычислить, сохранив (в кеше/DB/что-то наполовину стойкое) отметку времени текущего времени, как только команда будет запущена cron, чтобы следующая команда могла посмотреть это, когда она запускается, а затем перезапишите его для следующего запуска. Или просто сделайте сейчас() минус интервал cron, хотя это менее гибко.

После этого вы можете удалить само удаление и отправку материалов с вашей работы

 Смежные вопросы

  • Нет связанных вопросов^_^