laravel では、キューを使用することで、大規模な同時実行性や多言語通信インターフェイスなどの問題を解決できます。時間のかかるタスクや、同時に大量に並列処理できないタスクは、カプセル化してメッセージキューに転送することで、ハンドラが継続的にメッセージキューからメッセージを取り出して処理することで、メッセージキューを利用することで、大規模な同時実行の必要性がなくなりました。
#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。
メッセージ キューは大規模な Web プロジェクトに不可欠なモジュールであり、メッセージ キューを使用することで、大規模な同時実行性や多言語通信インターフェイスなどの問題を解決できます。
大規模な同時実行の問題の場合、時間のかかるタスクや、同時に大量に並列化できないタスクをカプセル化してメッセージ キューに転送できます。ハンドラーはメッセージ キューからメッセージを継続的に抽出して処理します。このようにして、メッセージを介してキューのバッファリングにより、大規模な同時実行状況でのブロックを防ぐことができます。パフォーマンスが十分でない場合は、複数の処理タスクを追加して、メッセージ キューからメッセージを取得して処理することができます。
たとえば、データベース操作では、データベースに対する読み取りおよび書き込み操作が多すぎると、テーブルのロックなどの問題が発生します。読み取りの問題はキャッシュやその他のソリューションによって解決できますが、書き込みの問題は問題はメッセージキューによって解決する必要があります。
また、大規模な Web プロジェクトの開発では、1 つの言語では実装できない場合が多く、理論上は PHP などの異なる言語を活用する必要があります。これは Web 開発のすべてを行うことができますが、リアルタイムのソケット接続や分散トランザクション処理など、一部の問題を解決するためにこれを使用すると効率が非常に低くなります。
Laravel のメッセージ キューを使用して非同期タスクを処理し、Redis をキュー データベースとして使用し、スーパーバイザー監視スクリプトの異常な中断と自動再起動を使用します。これはキュー タスクを処理するための Laravel の標準プロセスですが、実際にはさまざまな処理が行われる可能性があります。システムの信頼性を確保するには、いくつかの問題に注意する必要があります。
1. 失敗した実行のリトライ回数の設定
無限に失敗したタスクを回避するために、失敗したタスクの実行のリトライ回数を必ず設定してください。再試行を超過すると、Laravel はデフォルトで失敗タスクテーブルに、独自の実行失敗フォローアップ処理ロジックを記述することもできます。
phpArtisan queue:work redis --tries=3
データテーブルを作成するには、最初に次のコマンドを実行する必要があります:
phpArtisan Queue:failed-table
php職人移行
2. プログラム例外の処理
他のインターフェースに依存したり、HTTPリクエストをリクエストしたりするなど、プログラムの実行中に例外が発生することがあります。インターフェイス タイムアウトなど。例外がキャッチされない場合、現在のキューは中断され、実行を続行できません。たとえば、コンテンツを 10,000 人のユーザーにプッシュするには、インターフェイス プッシュに依存する必要があります。中間リクエストがハングすると、後続のプッシュに影響します。
ここでいう例外とは、プログラムの実行中に発生する例外のことです。常駐プロセスがハングアップするわけではありません。プログラムの例外によって必ずしも常駐プロセスが中断されるわけではありません。また、プロセスの中断は監視されており、スーパーバイザーによって再起動されました。
例外コード スニペットのキャッチなど:
try {undefined $r = $client->request('POST', '', [ 'query' => [ 'client_name' => 'filemail', 'client_version' => '1.0', 'client_sequence' => 0, 'uid' => 692934013,//119481237 'r' => 1508312484, ], 'body' => \GuzzleHttp\json_encode($body), ]); $result = $r->getBody()->getContents(); $result = json_decode($result, true); if ($result['result'] == 0) {undefined info("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), 0); } else {undefined Log::warning("sendMail fail:" . json_encode($result)); $this->pushLog($task['id'], $task['mail_id'], implode(',', $userIds), json_encode($result), $result['result']); } } catch (RequestException $e) {undefined Log::warning('RequestException' . $e->getMessage()); } catch (Exception $e) {undefined Log::emergency('Exception' . $e->getMessage()); }
[関連する推奨事項: laravel ビデオ チュートリアル]
以上がlaravelがキューを使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。