1
要求をリモートサービスに送信するキューがあります。時にはこのサービスはメンテナンスを受けます。このような状況に遭遇した場合、すべてのキュータスクを一時停止して10分後に再試行したい。それをどうやって実装するのですか?Laravelキューを一時停止する方法
要求をリモートサービスに送信するキューがあります。時にはこのサービスはメンテナンスを受けます。このような状況に遭遇した場合、すべてのキュータスクを一時停止して10分後に再試行したい。それをどうやって実装するのですか?Laravelキューを一時停止する方法
<?php
namespace App\Jobs;
use ...
class SendRequest implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
const REMOTE_SERVER_UNAVAILABLE = 'remote_server_unavailable';
private $msg;
private $retryAfter;
public function __construct($msg)
{
$this->msg = $msg;
$this->retryAfter = 10;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(){
try {
// if we have tried sending the request and get a RemoteServerException, we will
// redispatch the job directly and return.
if(Cache::get(self::REMOTE_SERVER_UNAVAILABLE)) {
self::dispatch($this->msg)->delay(Carbon::now()->addMinutes($this->retryAfter));
return;
}
// send request to remote server
// ...
} catch (RemoteServerException $e) {
// set a cache value expires in 10 mins if not exists.
Cache::add(self::REMOTE_SERVER_UNAVAILABLE,'1', $this->retryAfter);
// if the remote service undergoes a maintenance, redispatch a new delayed job.
self::dispatch($this->msg)->delay(Carbon::now()->addMinutes($this->retryAfter));
}
}
}
しかし、その場合、すべてのジョブがサーバーに当たることになります。たとえば、キューに1000個のジョブがある場合、すべてのジョブは10分ごとにリクエストを試みます。私が望むのは、1つのジョブがメンテナンス例外を取得した場合、他のジョブをすべて停止する必要があるということです。 – Poma
こんにちはポマ、遅くまで申し訳ありません。私は自分の答えを編集しました。確認してください。キューを一時停止することはできませんが、リモートサーバが利用できないことがわかっている場合は、reqeustの送信を停止するためにグローバル変数(たとえば、redisの変数)を使用できます。 –
素晴らしいアイデア!不要なリクエストを避ける – Poma