非同期処理の基本

メモ

メモ

Trailblazer の皆さん!

Salesforce には Lightning Experience と Salesforce Classic の 2 つの異なるデスクトップユーザインターフェースがあります。このモジュールは Salesforce Classic 向けです。

インターフェース間の切り替え、Lightning Experience の有効化などについての詳細は、Trailhead の「Lightning Experience の基本」モジュールを参照してください。

学習の目的

この単元を完了すると、次のことができるようになります。
  • 同期処理と非同期処理の違いを説明する。
  • さまざまなシナリオで使用する非同期 Apex の種類を選択する。

非同期 Apex

簡単に言うと、非同期 Apex は、複数の処理を後で別個のスレッドで実行するために使用します。

非同期処理とは、ユーザがタスクの終了まで待つことなく、タスクを「バックグラウンドで」実行するプロセスまたは機能です。

次に、実際の例を示します。週 1 回の「ダンスレボリューション」の練習の前に終わらせなければならない用事のリストがあるとします。自動車からは変な音がし、別の色のヘアジェルが必要で、実家にユニフォームを取りに行かなくてはなりません。車を修理工場に持ち込み、修理が終わるまで待ってからリストの残りを完了することも (同期処理)、車を修理工場に残して他の用事を片付け、修理が終わったら工場から電話をもらうことも (非同期処理) もできます。時間どおりに家に帰り、ユニフォームにアイロンをかけてから練習に行きたい場合、非同期処理なら同じ時間で待ち時間なしにより多くのことができます。

通常、非同期 Apex は、外部システムへのコールアウト、制限の緩和が必要な操作、および特定の時間に実行する必要があるコードに使用します。非同期処理の大きな利点として次のようなものがあります。

ユーザの効率

商談が作成されたら常にカスタムオブジェクトに対して多くの計算を実行するプロセスがあるとします。これらの計算を実行するのに必要な時間は、ほぼ気にならない程度から、ユーザの生産性を妨げる場合までさまざまです。これらの計算は、ユーザの現在の作業とは連動していないため、プロセスの実行に長時間がかかってユーザを待たせるのは効率的な時間の使い方とは言えません。非同期処理では、ユーザは自分の作業を続行し、処理はバックグラウンドで実行して、その結果を都合のよいときに確認できます。

拡張性

プラットフォームのいくつかの機能を今後どこかの時点でリソースが使用可能になったときに実行できるようにすることで、リソースを管理し、すばやく拡張できます。これにより、プラットフォームは並行処理を使用してより多くのジョブを扱うことができます。

制限の緩和

非同期処理は、ガバナ制限と実行制限が緩和された新しいスレッドで開始します。ガバナ制限と実行制限が緩和されて困る人はいないはずです。

非同期 Apex にはいくつかの種類があります。それぞれの詳細についてはこの後すぐに取り上げるとして、まずここでは概要を説明します。

種別 概要 一般的なシナリオ
future メソッド 独自のスレッドで実行され、リソースが使用可能になるまで開始しない。 Web サービスコールアウト。
Apex の一括処理 通常の処理制限を超える大規模なジョブを実行する。 データの整理やレコードのアーカイブ。
Queueable Apex future メソッドと似ているが、追加のジョブチェーニングを提供し、より複雑なデータ型を使用できる。 外部 Web サービスを使用した逐次処理操作の実行。
スケジュール済みの Apex 特定の時間に実行されるように Apex をスケジュールする。 日次または週次タスク。

これらのさまざまな種類の非同期操作は、組み合わせることもできます。たとえば、一般的なパターンとして、スケジュール済み Apex ジョブから Apex 一括処理ジョブを起動できます。

ガバナ制限と実行制限の緩和

非同期 Apex を実行する主な利点の 1 つは、ガバナ制限と実行制限が緩和されることです。たとえば、非同期コールの使用時には、SOQL クエリの数は 100 から 200 クエリへと 2 倍になります。同様に、非同期コールでは合計ヒープサイズと最大 CPU 時間も大きくなります。

非同期では、制限が緩和されるだけでなく、それらのガバナ制限が、最初に非同期要求をキューに追加した同期要求の制限とは独立して適用されます。大幅な増加ではないとはいえ、基本的に Apex を別個に 2 回呼び出し、2 倍以上の処理能力があることになります。これは、現在のトランザクションでできるところまで処理を実行し、ガバナ制限に近づいたら非同期で続行する場合に便利です。

ヒープサイズ、最大実行時間、一般的な制限についての詳細は、「実行ガバナと制限」を参照してください。

非同期処理のしくみ

マルチテナント環境の非同期処理には、いくつかの課題があります。

処理の公正さを確保する

すべての顧客が処理リソースを公正に分配して利用できるようにします。

耐障害性を確保する

機器またはソフトウェアの障害が原因で非同期要求が失われないようにします。

プラットフォームは、キューベースの非同期処理フレームワークを使用します。このフレームワークを使用して、各インスタンス内の複数の組織の非同期要求を管理します。要求のライフサイクルは、次の 3 つの部分で構成されます。

キューへの追加

要求がキューに置かれます。この要求は、Apex 一括処理要求、future Apex 要求、またはその他のさまざまな要求のいずれかになります。プラットフォームは、その要求を処理するのに適切なデータと共に、要求をキューに追加します。

保持

キューに追加された要求は保持されます。要求は、障害回復とトランザクション機能提供のために永続ストレージに保存されます。

キューからの削除

キューに追加された要求がキューから削除されて処理されます。このステップでは、トランザクション管理が行われ、処理の失敗があってもメッセージが失われないようにします。

各要求はハンドラによって処理されます。ハンドラは、特定の要求種別に対して機能を実行するコードです。ハンドラは、インスタンスを構成する各アプリケーションサーバ上にある限定数のワーカースレッドによって実行されます。スレッドは、キューイングフレームワークからの作業を要求し、作業を受け取ると特定のハンドラを開始して作業を実行します。

リソース保護

非同期処理は、ブラウザおよび API を介したリアルタイム操作よりも優先度が低くなります。コンピューティングリソースの増加を処理するのに十分なリソースを確保するため、キューイングフレームワークはサーバメモリや CPU 使用率などのシステムリソースを監視し、しきい値を上回ると非同期処理を減らします。リソース保護とは、マルチテナントシステムの自己保護を表す言葉です。組織が配分よりも多くのリソースを消費しようとすると、通常のしきい値になるまで非同期処理は一時停止されます。つまり、処理時間は保証されませんが、最終的にはすべて処理されます。