我正在使用一個系統,該系統會在系統中的某個資源發生更改時隨時向我發送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隊列一無所知,但似乎我應該使用它。
如果你正在運行每5秒那豈不是更有意義只是爲了處理請求當你收到警報? – cmorrissey
有時,外部系統將發送多個webhook以進行相同的更改。在這些情況下,我會收到一個又一個請求,但實際上只應該同步一次。這樣做更有意義,因爲這兩個webhook可以組合在一起。此外,5秒的時間間隔可能會改變。 – flyingL123