バックエンドのスタンダード:Laravel入門
■第12話:イベントとキュー
(最終更新日:2024.08.03)
(絵が小さい場合はスマホを横に)
「イベントとキューを管理しよう」
今回はLaravelにおけるイベントとキューの重要性を学ぶ。
イベントは特定のアクションをトリガーする仕組みで、リスナーとともに動作する。
キューは非同期処理を可能にし、アプリケーションのパフォーマンス向上に寄与する。
イベント管理、リスナーの作成、キュージョブの実行、監視方法について理解を深め、効率的なバックエンド処理の実現を目指す。
1.イベントの管理
イベントの管理は、Laravelフレームワーク内で、特定のアクションやシナリオが発生したときに特定の処理を実行する仕組みだ。
この仕組みは、アプリケーションのモジュール間の依存関係を減らし、コードの再利用性と保守性を向上させるために使用される。
1.1 イベントとリスナーの基本概念
イベントは、アプリケーション内で特定のアクションが発生したことを示すクラスだ。
たとえば、ユーザーが登録したときや、注文が作成されたときにイベントが発生する。
リスナーは、イベントが発生したときに実行される処理を定義するクラスだ。
イベントが発生した際にどのようなアクションを行うかを指定する。
1.2 イベントとリスナーの作成
Laravelでは「php artisan make:event EventName」コマンドを使用してイベントクラスを作成し、
「php artisan make:listener ListenerName --event=EventName」コマンドを使用してリスナークラスを作成できる。
1.3 イベントのディスパッチ
イベントはevent()関数やEventファサードを使ってディスパッチできる。
たとえば、ユーザーが登録されたときにUserRegisteredイベントを発生させる場合、以下のように記述する。
以下の2文、どちらの書き方でも良い。
イベントのディスパッチ
1.4 リスナーの登録
リスナーは、イベントとリスナーの関連付けを定義するEventServiceProviderクラス内で登録される。
ここで、イベントが発生したときにどのリスナーが呼び出されるかを指定する。
1.5 イベントのブロードキャスト
Laravelは、イベントをクライアントサイドにブロードキャストするための仕組みも提供している。
これにより、WebSocketや他のリアルタイム通信を利用して、クライアントにイベントを通知できる。
ブロードキャスト可能なイベントは、ShouldBroadcastインターフェースを実装し、ブロードキャストするチャンネルやデータを定義できる。
1.6 イベントの使いどころ
イベントシステムは、アプリケーションの異なる部分が疎結合であることを保証し、
例えば、ユーザーが登録されたときにメールを送信する、ログを記録する、他のサービスと連携するなど、
さまざまな処理を簡単に追加できるようにする。
この仕組みを利用することで、開発者はコードの管理がしやすくなり、
特定のアクションに対する応答をより柔軟に変更することが可能になる。
2.リスナーの作成
リスナーの作成は、Laravelのイベント駆動開発において、イベントが発生した際に特定の処理を実行するためのクラスを作成するプロセスだ。
リスナーはイベントを「聞いて」、そのイベントに応じた処理を実行する。リスナーの作成と使用方法について詳しく説明する。
2.1 リスナーの役割
リスナーは、イベントが発生したときに実行されるロジックを定義する。
例えば、ユーザーが登録されたときに歓迎メールを送信する、ログを記録する、外部APIと連携するなどの処理を行うことができる。
2.2 リスナーの作成
Laravelでは「php artisan make:listener ListenerName --event=EventName」コマンドを使用してリスナークラスを作成する。
例えば、UserRegisteredというイベントに対応するリスナーを作成する場合、以下のコマンドを実行する。
このコマンドを実行すると、app/ListenersディレクトリにSendWelcomeEmailという名前のリスナークラスが生成される。
UserRegisteredイベントに対するリスナーの生成
2.3 リスナーの構造
リスナークラスには、イベントが発生した際に実行されるhandleメソッドが含まる。
このメソッドの中で、イベントに関連する処理を記述する。
例えば、SendWelcomeEmailリスナーでは、handleメソッド内でユーザーに歓迎メールを送信する処理を記述する。
この例では、UserRegisteredイベントから渡されるユーザー情報を使用して、歓迎メールを送信している。
セッションの操作
2.4 リスナーの登録
リスナーはapp/Providers/EventServiceProvider.phpファイル内で登録する。
このファイルでは、イベントとリスナーの関連付けを行う。
この設定により、UserRegisteredイベントが発生したときにSendWelcomeEmailリスナーが呼び出される。
イベントとリスナーの関連付け
2.5 キューを使用するリスナー
リスナーは、ShouldQueueインターフェースを実装することでキューに入れることができる。
これにより、リスナーの処理を非同期で実行でき、アプリケーションのパフォーマンスを向上させることができる。
上記の例では、SendWelcomeEmailリスナーがShouldQueueを実装しているため、キューを使用してメール送信処理を非同期に実行できる。
リスナーの作成と使用により、イベント駆動型アーキテクチャを実現し、アプリケーションの構成を柔軟かつ拡張可能にすることができる。
3.キュージョブの実行
キュージョブの実行は、Laravelにおける非同期処理を実現するための重要な機能だ。
これにより、時間のかかる処理をバックグラウンドで実行し、ユーザーの体験を向上させることができる。
以下に、キュージョブの実行に関する詳細な内容を説明する。
3.1 キュージョブとは
キュージョブは、バックグラウンドで実行される特定のタスクを定義するクラスだ。
例えば、メール送信、データベースのバックアップ、大量データの処理などの時間がかかる処理をキュージョブとして定義し、
これをキューに送ることで非同期に実行する。
3.2 キュージョブの作成
キュージョブは、php artisan make:job JobNameコマンドで作成する。
例えば、SendReminderEmailというキュージョブを作成するには「php artisan make:job SendReminderEmail」を実行する。
これにより、app/Jobs/SendReminderEmail.phpファイルが作成される。
3.3 ファイルの公開、アップロード、ダウンロード
キュージョブクラスには、実行される処理を記述するhandleメソッドがある。
このメソッド内に、実行したいタスクを記述する。
下記の例では、SendReminderEmailキュージョブがユーザーにリマインダーメールを送信する処理を定義している。
キュージョブによるメール送信
3.4 キュージョブの実行
キュージョブを実行するには、dispatchメソッドを使用する。
これにより、キュージョブはキューに送られ、バックグラウンドで処理される。
このコードでは、Userモデルのインスタンスをキュージョブに渡して実行している。
ページネーション情報をUserCollectionに注入
3.5 キューの設定
Laravelでは、キュードライバーとしてデータベース、Redis、Amazon SQSなどを使用できる。
設定は、config/queue.phpファイルで行う。
デフォルトでは、syncドライバーが使用され、キュージョブは即座に実行される。
3.6 キューワーカーの起動
キューワーカーは、キューに溜まったジョブを実行するプロセスだ。
「php artisan queue:work」コマンドを使用して起動します。
これにより、キューに入ったジョブがバックグラウンドで処理される。
3.7 ジョブのリトライとフェイル
ジョブが失敗した場合、自動的にリトライを試みることができる。
jobsテーブルには、失敗したジョブの情報が格納され、failed_jobsテーブルにはフェイルしたジョブの詳細が保存される。
これにより、必要に応じてジョブの再実行やトラブルシューティングが可能になる。
3.8 ジョブの優先順位と遅延実行
ジョブには優先順位を設定でき、高優先度のジョブが先に実行される。
また、ジョブを遅延実行することもでき、特定の時間が経過してから実行するように設定できる。
以上が、キュージョブの実行に関する基本的な内容だ。 キュージョブを使用することで、アプリケーションのスケーラビリティとユーザー体験を向上させることができる。
4.キューの監視と失敗ジョブの処理
キューの監視と失敗ジョブの処理は、キューシステムを効果的に管理し、失敗したジョブを適切に処理するための重要な部分だ。 これにより、アプリケーションの信頼性とパフォーマンスを確保できる。以下にその内容を詳しく説明する。
4.1 キューの監視
Laravelでは、キュージョブが正しく処理されるかを監視するためのツールとコマンドが提供されている。
「queue:work」コマンドは、キューワーカーがジョブを処理するためのコマンドだ。
指定されたキュードライバーに応じて、ジョブを取り出し、順次処理する。
例えば「php artisan queue:work」と実行すると、デフォルトのキューであるdefaultキューに積まれたジョブを順次処理する。
監視モード(queue:listen)はキューワーカーを監視して、ジョブが完了したらすぐに次のジョブを処理する。
queue:work コマンドとは異なり、毎回の実行ごとに新しいプロセスを立ち上げるため、コード変更が即座に反映される。
例えば「php artisan queue:listen」と実行する。
4.2 失敗ジョブの処理
ジョブが失敗することは避けられないため、失敗したジョブの処理方法も重要だ。
Laravelでは、失敗したジョブを追跡し、再試行する機能が提供されている。
4.2.1 失敗したジョブの保存:
失敗したジョブは、設定に応じて failed_jobs テーブルに記録される。
このテーブルには、失敗したジョブの情報(例:例外メッセージ、ジョブのクラス名、データなど)が保存される。
この情報をもとに、エラーの原因を調査でき、後に再試行するかを判断できる。
4.2.2 queue:failed コマンド
失敗したジョブの一覧を表示するためのコマンドだ。これにより、どのジョブが失敗したのかを確認できる。
4.2.3 queue:retry コマンド
失敗したジョブを再試行するためのコマンドだ。
指定したジョブIDを使って、特定のジョブを再実行することができる。
例えば「php artisan queue:retry 5」と実行すると、IDが5の失敗ジョブが再試行できる。
4.2.4 失敗ジョブの自動再試行
「retry_after」設定を使用して、ジョブが失敗した後に自動的に再試行するまでの時間を設定できる。
これらの機能を活用することで、ジョブの実行状況を適切に監視し、失敗したジョブの再試行やエラーの原因追跡が可能になる。 これにより、アプリケーションの信頼性を向上させることができる。
5.まとめ
第12回「イベントとキュー」では、Laravelにおけるイベントの管理、リスナーの作成、キュージョブの実行、キューの監視と失敗ジョブの処理について学んだ。 イベントを利用してアプリケーションの異なる部分間の通信を行い、キューを用いて非同期処理を実現した。 また、失敗したジョブの再試行やエラーの原因追跡を行うことで、アプリケーションの信頼性を向上させた。 今回学んだことを用いて、イベント実行をより確実なものにしよう。
▼参考図書、サイト
「改定2版 速習Laravel」 山田祥寛 WINGSプロジェクト
「1週間で基礎から学ぶLaravel入門」 Minatomi