2015-05-15 98 views
0

我正在使用一個系統,該系統會在系統中的某個資源發生更改時隨時向我發送webhook。 webhook包含已更新的資源的ID。例如,如果有人在此係統中編輯產品ID 1234,我的服務器將收到一條警報,稱產品1234已更改。然後,我向他們的API發出請求,以獲取產品1234的最新數據並將其保存到我的系統中。Laravel每5秒運行一次工匠命令

我正在建立這個過程異步工作。意思是,每當我收到webhook時,我都會將詳細信息保存到記錄資源ID的數據庫表中。然後,我有一個WebhookQueue類,其中包含run()方法,該方法處理所有排隊的請求並更新相應的產品。下面是來自WebhookQueue類的代碼:

public static function run() 
{ 
     //get request data 
     $requests = WebhookRequest::select(
         'webhook_type', 
         'object_ext_id', 
         'object_ext_type_id', 
         \DB::raw('max(created_at) as created_at') 
       ) 
       ->groupBy(['webhook_type', 'object_ext_id', 'object_ext_type_id']) 
       ->get(); 

     foreach ($requests as $request) { 
       // Get the model for each request. 
       // Make sure the model is not currently syncing. 
       // Sync the model. 
       // Delete all webhook request of the same type that were created before created_at on the request 
       if ($request->webhook_type == 'product') { 
         $model = Product::where([ 
             'ext_id'=> $request->object_ext_id, 
             'ext_type_id'=> $request->object_ext_type_id 
           ])->firstOrFail(); 

         if (!$model->is_syncing) { 
           $model->syncWithExternal(); 

           WebhookRequest::where([ 
             'webhook_type'=>$request->webhook_type, 
             'object_ext_id'=>$request->object_ext_id, 
             'object_ext_type_id'=>$request->object_ext_type_id, 
           ]) 
           ->where('created_at', '<=', $request->created_at) 
           ->delete(); 
         } 
       } 
     } 
} 

我還創建了一個簡單的執行一行代碼來處理隊列中的命令。該命令是php artisan run-webhook-queue

我的計劃是每5秒鐘通過一個cron作業來運行此命令,但是我剛剛瞭解到cron作業不能按分鐘進行更細粒度的調度。

我該如何獲得此命令每5秒運行一次,或者是否有其他方式可以處理這種情況?我對Laravel隊列一無所知,但似乎我應該使用它。

+0

如果你正在運行每5秒那豈不是更有意義只是爲了處理請求當你收到警報? – cmorrissey

+0

有時,外部系統將發送多個webhook以進行相同的更改。在這些情況下,我會收到一個又一個請求,但實際上只應該同步一次。這樣做更有意義,因爲這兩個webhook可以組合在一起。此外,5秒的時間間隔可能會改變。 – flyingL123

回答

0

Laravel Worker Queues可以很好地處理這個問題,並且允許您每隔5秒運行一次命令。如果你使用Forge,安裝幾乎沒有任何工作。

下面是使用僞造的指南:https://mattstauffer.co/blog/laravel-forge-adding-a-queue-worker-with-beanstalkd

這裏,如果你不使用僞造的指南:http://fideloper.com/ubuntu-beanstalkd-and-laravel4

+0

謝謝,在我的Google搜索中深入了幾頁之後,我剛剛遇到了這些指南。看起來這些應該可以幫助我獲得我需要的東西。 – flyingL123