我想創建的是一個系統,讀取/解析來自十幾個外部網站的數據。完成後重新開始的工作?
舉個例子,假設我想創建一個系統來解析特定用戶的個人資料頁面上的Twitter帖子。我想爲十幾個用戶做到這一點。
此外,我想爲這些用戶中的每一個運行單獨的作業。所以如果有12個用戶,我需要運行12個作業。
當作業完成後(即它已經解析了頁面上所有用戶的帖子),我需要重新開始工作(以便解析任何新帖子)。
因此,最終,如果有12個用戶,我應該有12個不斷運行的作業,這些作業將解析由這12個用戶中的任何一個創建的任何新帖子。
據我所知,有兩種方法可以做到這一點。第一種是使用cron jobs,第二種是使用Laravel的queuing system。
解決此問題的最佳方法是什麼?克倫工作或隊列?我將如何正確實施它?
對於cron作業,我能想到的兩個問題是crons基於時間運行,而不是基於作業完成,這意味着如果作業完成,它必須等到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