今日, 無事Salesforce認定アドミニストレーターの試験に合格できたので, 次なる資格「Salesforce Platform デベロッパー」の学習に入ろうと思う.
Salesforceでカスタムオブジェクトのレコードを非同期に処理するための最適なアプローチをとは? バッチ処理が必要とされ, 大量のデータレコードに対して複雑なビジネスロジックを適用させる必要があるシナリオを想定している.
A. Apexトリガーを使用して、データの変更時にロジックを同期的に実行します。
B. @futureアノテーションを持つメソッドを使用して、処理を非同期に実行します。
C. Queueable Apexを使用して、ジョブをキューに入れ、非同期に処理します。
D. Database.Batchableインタフェースを実装したApexクラスを使用して、バッチ処理を行います。
上記のような設問と選択肢があり, 解答は以下のようになるらしい.
解答: Database.Batchableインターフェースを実装したApexクラスを使用する.
Aはデータの変更などが発生した際にリアルタイムに実行して処理してくれるが, 大量のデータを効率よく処理することには向かない.
Bの@futureメソッドも非同期処理を可能にするが, 一度に処理できるデータ量に限りがあり, 複雑なビジネスロジックを適用するには制限があるため, 設問のシナリオでは適さない.
CのQueueableも非同期処理を可能にするが, 大量のデータ処理には向いていない.
DのDatabase.Batchableはそもそも作りとして大量レコードを扱うように設計されているらしい.
ここでは, 設問に「バッチ処理が必要とされ, 」と記載があるからDがベストプラクティスとなるのかな? (一般的な非同期処理には@futureが使われることが多いらしい)
@futureでも大量レコードの処理が可能ではあるらしいから, バッチ処理のような複雑なロジックが組まれる場合はDatabase.Batchableインターフェースを使用する, ということで納得することにした.
通常, Salesforceでのクエリ実行にはガバナ制限が適当されており, 大量のデータを処理する場合には特に気をつけなければならない. そこでBatch Apexという仕組みを使う. 最大の実行可能レコード件数は5千万件となる.
(https://plus-idea.net/batch-apex/)
-- Database.Batchableについて --
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_batch_interface.htm