То, что я пытаюсь создать, - это система, которая читает/анализирует данные из более чем дюжины внешних веб-сайтов.Работа, которая начинается после завершения?
В качестве примера предположим, что я хочу создать систему, которая анализирует сообщения 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));
}
}
Вы действительно ищете сообщения в Twitter? Если это так, вы должны посмотреть на их потоковые конечные точки.Создание бесконечной работы было бы довольно просто, используя цикл while, основанный на состоянии соединения. – ExoticChimp
Нет, я не ищу сообщения в Twitter. Мой пример был упрощением общей идеи. – user6605184