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