非同期処理の基本
学習の目的
この単元を完了すると、次のことができるようになります。
- 同期処理と非同期処理の違いを説明する。
- さまざまなシナリオで使用する非同期 Apex の種類を選択する。
非同期 Apex
簡単に言うと、非同期 Apex は、複数の処理を後で別個のスレッドで実行するために使用します。非同期処理とは、ユーザーがタスクの終了まで待つことなく、タスクを「バックグラウンドで」実行するプロセスまたは機能です。
次に、実際の例を示します。今日は週に一度のダンスの練習があるというのに、車から変な音がするので工場で点検してもらう必要があり、新しい色のヘアジェルも買って、母親の家までユニフォームを取りに行かなければならないとしましょう。この場合、車を修理工場に持ち込んで、車が直ってから他の用事に順番に取り掛かるのが同期処理です。一方で、車を修理工場に預けておいて、直ったという連絡があるまでに他の用事を済ませるのが非同期処理です。非同期処理なら同じ時間でより多くのことができます。
非同期 Apex は、外部システムへのコールアウトや、制限の緩和が必要な操作、特定の時間に実行する必要があるコードに最適です。非同期処理の大きな利点として次のようなものがあります。
- ユーザーの効率。商談が作成されたら常にカスタムオブジェクトに対して多くの計算を実行するプロセスがあるとします。これらの計算を実行するのに必要な時間は、ほぼ気にならない程度から、ユーザーの生産性を妨げる場合までさまざまです。これらの計算は、ユーザーの現在の作業とは連動していないため、プロセスの実行に長時間がかかってユーザーを待たせるのは効率的な時間の使い方とは言えません。非同期処理では、処理をバックグラウンドで実行させて、ユーザーは自分の作業を続行できます。そして、処理の結果を都合のよいときに確認できます。
- 拡張性。Salesforce Platform のいくつかの機能を今後どこかの時点でリソースが使用可能になったときに実行できるようにすることで、リソースを管理し、すばやく拡張できます。これにより、プラットフォームは並行処理を使用してより多くのジョブを扱うことができます。
- 制限の緩和。非同期処理は、ガバナ制限と実行制限が緩和された新しいスレッドで開始します。
非同期 Apex にはさまざまな種類があります。それぞれの詳細についてはこの後すぐに取り上げるとして、まずここでは概要を説明します。
種別 | 概要 | 一般的なシナリオ |
|---|---|---|
future メソッド | 独自のスレッドで実行され、リソースが使用可能になるまで開始しない。Apex の future メソッドではなく Queueable Apex を使用することをお勧めします。Queueable は future メソッドと同じユースケースに対応していますが、いくつか追加の利点があります。 | Web サービスコールアウト。 |
Apex の一括処理 | 通常の処理制限を超える大規模なジョブを実行する。 | データの整理やレコードのアーカイブ。 |
Queueable Apex | future メソッドと似ているが、追加のジョブチェーニングを提供し、より複雑なデータ型を使用できる。 | 外部 Web サービスを使用した逐次処理操作の実行。 |
スケジュール済みの Apex | 特定の時間に実行されるように Apex をスケジュールする。 | 日次または週次タスク。 |
これらのさまざまな種類の非同期操作は、組み合わせることもできます。たとえば、一般的なパターンとして、スケジュール済み Apex ジョブから Apex 一括処理ジョブを起動できます。
一緒にトレイルを進みましょう
インストラクターと一緒にこの手順を進めますか? 次の動画をご覧ください。これは Trailhead Live の「Trail Together (一緒にトレイル)」シリーズの一部です。完全なセッションへのリンクは、「リソース」セクションを参照してください。
ガバナ制限と実行制限の緩和
非同期 Apex を実行する主な利点の 1 つは、ガバナ制限と実行制限が緩和されることです。たとえば、非同期コールの使用時には、SOQL クエリの数は 100 から 200 クエリへと 2 倍になります。同様に、非同期コールでは合計ヒープサイズと最大 CPU 時間も大きくなります。
非同期 Apex では、制限が緩和されるだけでなく、それらのガバナ制限が、最初に非同期要求をキューに追加した同期要求の制限とは独立して適用されます。基本的には、Apex を別々に 2 回呼び出すことで、2 倍以上の処理能力があることになります。これは、現在のトランザクションでできるところまで処理を実行し、ガバナ制限に近づいたら非同期で続行する場合に便利です。
ヒープサイズ、最大実行時間、および一般的な制限についての詳細は、「実行ガバナと制限」を参照してください。
非同期処理のしくみ
マルチテナント環境の非同期処理には、いくつかの追加の課題があります。
- 処理の公正さを確保する。すべての顧客が処理リソースを公正に分配して利用できるようにします。
- 耐障害性を確保する。機器またはソフトウェアの障害が原因で非同期要求が失われないようにします。
プラットフォームでは、キューベースの非同期処理フレームワークを使用します。このフレームワークを使用して、各インスタンス内の複数の組織の非同期要求を管理します。要求のライフサイクルは、次の 3 つの部分で構成されます。
- キューへの追加。要求がキューに置かれます。この要求は、Apex 一括処理要求、Apex future メソッド要求、またはその他のさまざまな要求のいずれかになります。プラットフォームは、その要求を処理するのに適切なデータと共に、要求をキューに追加します。
- 保持。キューに追加された要求は保持されます。要求は、障害回復とトランザクション機能提供のために永続ストレージに保存されます。
- キューからの削除。キューに追加された要求がキューから削除されて処理されます。処理が失敗した場合、要求が失われないようにトランザクションの制御が機能します。
各要求はハンドラーによって処理されます。ハンドラーは、特定の要求種別に対して機能を実行するコードです。ハンドラーは、インスタンスを構成する各アプリケーションサーバー上にある限定数のワーカースレッドによって実行されます。スレッドは、キューイングフレームワークからの作業を要求し、作業を受け取ると特定のハンドラーを開始して作業を実行します。
リソース保護
非同期処理は、ブラウザーや API を介したリアルタイム操作よりも優先度が低くなります。コンピューティングリソースの増加を処理するのに十分なリソースを確保するため、キューイングフレームワークはサーバーメモリや CPU 使用率などのシステムリソースを監視し、しきい値を上回ると非同期処理を減らします。リソース保護とは、マルチテナントシステムの自己保護を表す言葉です。組織が配分よりも多くのリソースを使おうとすると、通常のしきい値になるまで非同期処理は一時停止されます。処理時間は保証されませんが、最終的にはすべて処理されます。
リソース
- Apex 開発者ガイド: 実行ガバナと制限
- Apex 開発者ガイド: Asynchronous Apex (非同期 Apex)
- Architecture Center: Asynchronous Processing (非同期処理)