我使用redis::throttle调用api发送sms并保存其响应,以将调用速率限制为每60秒5次,并使用:
Redis::throttle('throttle:sms')->allow(5)->every(60)->then(function(){
//->API call
//->Save response
},function($error){//could not obtain lock
return $this->release(60);//Put back in queue in 60s
});
我没有具体说明 $tries
因为如果无法获得锁,它将被视为一次尝试,如果我处理一个长队列并且多次无法获得锁,那么作业将失败,而不会出现任何“真正的”错误。但我不想永远处理作业,如果有一个真正的错误(如如果响应无法保存),它应该失败而不重试,特别是如果错误后的api调用作为重试将发送另一条短信(我绝对不希望)。
我试过的:
Redis::throttle('throttle')->allow(5)->every(60)->then(function(){
try{
$response = MyAPICall();
$test = 8/0;
saveResponse($response);
} catch(\LimiterTimeoutException $e){
throw $e;
} catch(Exception $e){
Log::error($e);
$this->fail($exception = null);
//$this->delete();
}
},function($error){//could not obtain lock
Log::info($error);
return $this->release(60);//Put back in queue in 60s
});
如果因为无法获取锁而出现异常,我会将其抛出,让队列处理它,但如果是另一个异常,我会记录错误并失败或删除作业。但这两者都不起作用 delete()
或者 fail()
,则始终重试作业。
如果存在异常而不是 LimiterTimeoutException
?
暂无答案!
目前还没有任何答案,快来回答吧!