2016-07-18 42 views
0

我想創建的是一個系統,讀取/解析來自十幾個外部網站的數據。完成後重新開始的工作?

舉個例子,假設我想創建一個系統來解析特定用戶的個人資料頁面上的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)); 
    } 
} 
+0

你實際上是在尋找Twitter的帖子?如果是這樣,你應該看看他們的流媒體端點。通過使用基於連接狀態的while循環創建一個永無止境的工作將是相當容易的 – ExoticChimp

+0

不,我不在尋找Twitter帖子。我的例子是對總體思想的簡化。 – user6605184

回答

0

我沒有試過,但我會假設你可以創建一個遞歸作業。

這個遞歸作業會執行它需要的所有代碼,然後在執行結束時它會創建一個新的作業並將它推送到隊列中 - 然後一旦隊列準備就緒就會開始運行它。

如果作業在任何時候都失敗,您將不會創建新作業,因此您不會有任何同一用戶的作業正在同時運行。失敗的工作將被重新嘗試 - 當成功時,會創造一份新工作。

0

您可以使用組合。創建一個像'RetrieveDataCommand'之類的命令。這個命令應該將作業推送到每個用戶的隊列中,以便爲該用戶檢索數據(如果需要,可能還需要一個單獨的作業以供實際處理?)。如果'previous'命令運行時,作業應該考慮'$ from'參數,該參數是時間戳記。運行時,它將檢索時間段$ from到now()的所有用戶的所有數據。

然後你可以有一個cron作業每10秒運行一次命令或其他任何東西。 $ from可以通過在cron運行該命令後立即存儲(在緩存/ DB /某種半永久性中)當前時間的時間戳來計算,以便下一個命令在運行時可以查看它,然後覆蓋它爲下一次運行。或者乾脆now()減去cron時間間隔,雖然靈活性較差。

然後,您可以刪除自我刪除,並從您的工作調度東西

相關問題