バックグラウンドジョブとワーカー
バックグラウンドジョブとワーカーが、非同期・長時間実行・ノンブロッキングなバックエンドタスクをどのように処理するかを探ります。
バックグラウンドジョブが存在する理由
一部のタスクはリクエスト中に実行すると時間がかかりすぎるため、システムを高速で応答性の高い状態に保つには、リクエストのライフサイクルの外に移す必要があります。
- 長時間実行されるタスクは、ユーザーへの応答を大幅に遅らせることがあります。
- 一般的な例には、メール送信、レポート生成、メディアファイルの処理などがあります。
- バックグラウンドジョブを使うと、これらのタスクをユーザー向けのリクエストとは別に実行できます。
詳細
典型的なバックエンドシステムでは、リクエストは短時間で完了することが期待されます。ユーザーは通常、数ミリ秒から長くても数秒以内の応答を期待します。しかし、アップロードされた動画の処理、大きなレポートの生成、多数のユーザーへの通知送信など、もっと時間のかかる処理もあります。
これらのタスクをリクエストのライフサイクル内で直接実行すると、サーバーは応答する前に完了を待たなければなりません。その結果、応答時間が遅くなり、特にトラフィックが多い状況ではタイムアウトの原因にもなります。
これはユーザー体験を悪化させるだけでなく、長時間の処理にリソースが占有され、新しいリクエストを処理できなくなるため、システム効率も下がります。
これを解決するために、バックエンドシステムはこれらのタスクをバックグラウンドに移します。サーバーはクライアントにすばやく応答し、長時間かかるタスクはリクエストのライフサイクルの外で非同期に継続されます。
この分離は、現代のバックエンドシステムにおける基本的な設計パターンであり、高速な応答を維持しながら、複雑で時間のかかる処理も確実に扱えるようにします。
ワーカープロセス
ワーカープロセスは、メインのWebサーバーの外でバックグラウンドジョブを実行する専用プログラムです。
- ワーカーはWebサーバーとは別に動作し、ジョブの処理だけに集中します。
- キューからタスクを継続的に取り出して処理します。
- ワーカーを増やすと、システムのスループットと並列処理能力が向上します。
詳細
ワーカープロセスは、キューに保存されたタスクを実行する役割を担います。受信したリクエストを処理するWebサーバーとは異なり、ワーカーは独立して動作し、バックグラウンドジョブの実行に最適化されています。
各ワーカーはタスクキューを継続的に監視し、利用可能なジョブを取り出します。タスクを取得すると、そのジョブを処理してから次のジョブへ進みます。
ワーカーは別々のプロセスとして動作するため、メインアプリケーションとは独立してスケールできます。これにより、リクエスト処理を遅くすることなく、増加する負荷に対応できます。
ワーカーを増やすと、複数のジョブを並列に処理できるようになり、スループットが向上します。これは、大量のバックグラウンドタスクを効率的に処理するうえで重要です。
メッセージブローカーとキューシステム
メッセージブローカーは、バックグラウンドジョブを保存し、配信し、ワーカーに確実に届けるためのインフラを提供します。
- メッセージブローカーは、タスクキューの基盤となるシステムとして機能します。
- 一般的な技術には Kafka、RabbitMQ、AWS SQS があります。
- これらは、タスクが確実に保存、配信、処理されることを保証します。
詳細
メッセージブローカーは、アプリケーションとワーカープロセスの間に置かれ、タスクの流れを管理するシステムです。アプリケーションがジョブを作成すると、ワーカーに直接送るのではなく、ブローカーに送信します。
ブローカーはジョブを永続的に保存し、システムの一部に障害が発生しても失われないようにします。これは信頼性のために重要で、特に障害がどこで起きるかわからない分散システムでは重要です。
その後、ワーカーはブローカーに接続し、処理できる状態になったときにタスクを取得します。これにより、アプリケーションと実行層が分離され、両者を独立してスケールできるようになります。
メッセージブローカーは分散処理もサポートしており、異なるマシン上の複数のワーカーが同時にタスクを処理しながら、信頼性の高い配信保証を維持できます。
遅延ジョブ
遅延ジョブを使用すると、タスクをすぐに実行するのではなく、後の時刻に実行するようスケジュールできます。
- タスクは、特定の遅延後に実行するようスケジュールできます。
- 一般的な用途には、リマインダーや失敗したジョブの再試行があります。
- これにより、バックエンドシステムで時間ベースの自動化が可能になります。
詳細
すべてのタスクをすぐに実行する必要があるわけではありません。多くの場合、24時間後にリマインダーメールを送信する、あるいは短い遅延の後に失敗した処理を再試行するなど、作業を後の時刻に実行するようスケジュールする必要があります。
遅延ジョブを使うと、システムはタスクをすぐに処理するのではなく、いつ実行すべきかを定義できます。タスクは遅延時間または予定時刻とともに保存され、システムはその時刻に達したときに確実に実行します。
これは通常、ジョブがいつワーカーに利用可能になるかを追跡するメッセージブローカーやスケジューリングシステムを使って実装されます。遅延が終了するまでは、タスクは非アクティブのままで、ワーカーに取り出されることはありません。
予定時刻に達すると、ジョブはアクティブキューに移され、他のタスクと同様に処理されます。この仕組みは、信頼性の高い再試行システムや時間ベースのワークフローを構築するうえで不可欠です。
遅延実行は、現代のバックエンドシステムにおける重要な機能であり、手動介入なしに自動化を可能にし、障害耐性を向上させます。
Cronジョブ
Cronジョブは、固定されたスケジュールに従ってタスクを自動実行し、手動介入なしで繰り返し処理を可能にします。
- Cronジョブは、あらかじめ定義された時間間隔でタスクを実行します。
- 一般的な用途には、メンテナンス、レポート作成、請求処理などがあります。
- これらはユーザーのリクエストではなく、スケジューラによってトリガーされます。
詳細
Cronジョブは、毎晩、毎日、毎週など、特定の時刻や間隔でタスクを繰り返し実行するために使われます。ユーザーの操作によってトリガーされるバックグラウンドジョブとは異なり、Cronジョブはスケジューラによって開始されます。
スケジューラは、しばしば cron と呼ばれ、時間ベースのルールを管理し、その条件が満たされたときにタスクをトリガーします。たとえば、システムが毎晩深夜にデータベースのクリーンアップジョブを実行したり、毎朝分析レポートを生成したりすることがあります。
トリガーされると、スケジュールされたタスクは通常、ワーカープロセスに送られるか、バックグラウンドジョブとして実行されます。これにより、システムはリアルタイムのリクエスト処理に影響を与えることなく、繰り返し発生するワークロードを処理できます。
Cronジョブは、定常的な運用を自動化し、メンテナンスや定期タスクを手作業なしで一貫して実行するために不可欠です。
バックグラウンドジョブにおける失敗の処理
バックグラウンドジョブは失敗することがあるため、システムはタスクが最終的に完了するように再試行戦略を実装する必要があります。
- 分散システムでは失敗は想定されるものであり、明示的に処理しなければなりません。
- リトライキューを使うと、失敗したタスクを後でもう一度試行できます。
- デッドレターキューは、繰り返し失敗するタスクを保持します。
詳細
バックグラウンドタスクは、データベース、API、ネットワークサービスなどの外部システムに依存することが多く、これらは予測不能に失敗することがあります。そのため、失敗の処理はあらゆるバックグラウンドジョブシステムにおいて重要な要素です。
一般的な方法の1つは、失敗したタスクを再試行することです。ジョブが失敗すると、リトライキューに戻され、一定の遅延の後でもう一度試行されます。これにより、一時的な失敗であれば成功する可能性が高まります。
システムへの負荷が大きくなりすぎないように、再試行は指数バックオフを使って間隔を空けることがよくあります。これは、各再試行の待ち時間を前回より長くする方法です。これにより、短時間に失敗を繰り返して追加の負荷が発生するのを防げます。
タスクが何度も失敗する場合は、デッドレターキューに移されます。これにより、システム全体の処理を妨げることなく、エンジニアが問題のあるジョブを調査し、デバッグできます。
これらのパターンにより、失敗が発生してもバックグラウンド処理の信頼性を保てます。これは、堅牢なバックエンドシステムを構築するうえで不可欠です。
質問セクション
1 / 5
このレッスンはプレミアムコンテンツです
プレミアムにアップグレードしてぼかしを解除し、全文を読めるようにしましょう。