Salesforceにおける非同期処理の概要

Salesforceでプロセスを実行する際に最初に尋ねるべき質問は、同期的に実行するか非同期的に実行するかです。タスクを遅延させることができ、即座の結果を必要としない場合は、常にSalesforceの非同期プロセスを活用することが有利です。なぜなら、それらは技術アーキテクチャに重要な利点をもたらすからです。

非同期処理とは何ですか?

非同期プロセスは独自のスレッドで実行され、ユーザーが待機することなくタスクを完了させることができます。以下に主な利点を示します:

1. ユーザーエクスペリエンスとパフォーマンスの向上

非同期プロセスはバックグラウンドで実行されるため、ユーザーはそれが完了するのを待つ必要がありません。これにより、ユーザーは作業を中断することなく継続でき、ページの読み込み時間やシステム全体のパフォーマンスが向上します。

2. 上限の増加

Salesforceは同期トランザクションに厳しい制限を課しており、トランザクションあたりのクエリやDML操作の数などが制限されています。非同期処理には追加の実行制限があり、オペレーションをスケーリングする余地が増えます。

3. スケーラビリティ

複雑またはリソース集約的なタスクをバックグラウンドで実行することで、非同期処理はシステムのパフォーマンスを損なうことなく効率的にビジネスをスケーリングするのに役立ちます。

Salesforceが非同期処理に提供するさまざまなツールを以下に示します。

主な考慮事項

これまでに、非同期処理とその利点、およびSalesforceがこれらのタスクに提供するさまざまなツールについて探究してきました。ただし、ビジネスニーズに非同期処理を選択する前に検討すべき重要な要素がいくつかあります。

1. 非同期処理にはSLAがありません

非同期プロセスには保証されたサービスレベル契約(SLA)がありませんので、リソースが利用可能なときに独自のスレッドで実行されます。したがって、タスクが特定の時間枠内に完了する保証がないため、時間的に敏感なビジネスフローに非同期処理を使用しないことが重要です。

2. 適切なツールを選択する

先ほど述べたように、Salesforceは非同期処理用にさまざまなツールを提供しており、それぞれ異なるユースケースに対応しています。各ツールの強みと制限を理解することで、特定のニーズに最も適したものを選択できます。

3. コードをバルキファイする

Salesforceは非同期プロセスに対して拡張実行制限を提供していますが、複数のレコードを効率的に処理できるようにコードをバルキファイすることが依然として重要です。これにより、コードがプラットフォームの制限内にとどまり、パフォーマンスが維持されます。

エラーハンドリングとモニタリングの実装

非同期ジョブはバックグラウンドで実行されるため、頑強なエラーハンドリングとモニタリングが不可欠です。 try-catch ブロックを使用してエラーをカスタムオブジェクトに記録し、トラッキングを容易にします。さらに、API呼び出しの問題などの断続的な障害を管理するためにリトライロジックを実装し、プロセスの信頼性を確保します。

非同期ツールの詳細

Salesforceの非同期ツールを詳しく見てみましょう。

Futureメソッド

Futureメソッドは、独自のスレッドで独立して実行できる操作に使用されます。ユーザーが操作の完了を待つ必要がない外部Webサービス呼び出しを実行する場合が一般的です。

Futureメソッドを定義するには、単純にメソッドに @future アノテーションを付けます。

Java

 

public class FutureClass {
@future
 public static void myFutureMethod(list recordIds){
   //長時間実行するコード
 }  
}

Futureメソッドに関する重要なポイント:

  • Static。Futureメソッドは静的である必要があります。
  • Void戻り値型。戻り値は void のみです。
  • プリミティブデータ型。Futureメソッドはプリミティブデータ型(例:StringIntegerId)のみを受け入れることができます。複雑なオブジェクトをパラメーターとして受け取ることはできません。
  • コールアウト。FutureメソッドがWebサービスコールアウトを行う必要がある場合は、アノテーションに callout=true 属性を含める必要があります。
Java

 

public class FutureClass {
@future(callout = true)
 public static void myFutureMethod(){
   //ここにコールアウト
 }  
}

Queueable Apex

将来のメソッドと同様に、Queueable Apexを使用すると、自分自身のスレッドで操作を実行できるため、長時間実行されるタスクに最適です。これは、Apexジョブキューを活用し、将来のメソッドと比較して非同期処理への柔軟で強力なアプローチを提供します。

Queueable Apexを実装するには、クラスはQueueableインターフェースを実装する必要があります。クラスは常に非同期操作のロジックを含むexecuteメソッドを定義する必要があります。

Java

 

public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
  //長時間実行される操作
}
}

System.enqueueJob()を呼び出すことで、Queueable Apexを実行できます。これにより、ジョブがキューに追加され、ジョブIDが返されます。このジョブIDを使用して、AsyncApexJobオブジェクトをクエリしてジョブの状態を監視できます。

Java

 

ID jobID = System.enqueueJob(new QueueableClass());

Queueable Apexに関するキーポイント:

  • プリミティブでないデータ型。将来のメソッドとは異なり、Queueableクラスのメンバ変数としてプリミティブでないデータ型を使用できます。
  • ジョブのチェーン化。Queueableジョブはチェーンでき、既に実行中のジョブから第二のジョブを開始でき、非同期操作のシーケンスを作成できます。

Batch Apex

大量のレコードで非同期操作を実行する必要がある場合、Batch Apexが最適な解決策です。これにより、大きなデータセットが処理可能なサイズの小さなチャンクに分割されます。

Batch Apexを実装するには、クラスはDatabase.Batchableインターフェースを実装する必要があります。Batch Apexクラスはstartexecute、およびfinishの3つのメソッドを定義する必要があります。

1. 開始メソッド

このメソッドはバッチジョブの開始時に実行されます。大規模なデータセットを収集するためのSOQLクエリを含み、QueryLocatorを返す必要があります。SOQLクエリによって取得されるレコードの総数に対するガバナーリミットは、Batch Apexを使用する際にstartメソッドでバイパスされます。

Java

 

public Database.QueryLocator start(Database.BatchableContext bc) {}

2. 実行メソッド

executeメソッドは、レコードの各バッチごとに呼び出されます。レコードが処理される順序は保証されていません。

Java

 

public void execute(Database.BatchableContext bc, list<Object>){}

3. 終了メソッド

finishメソッドは、すべてのレコードのバッチが処理された後に呼び出されます。通常、通知メールの送信などの後処理タスクに使用されます。バッチジョブの各実行は単一のトランザクションと見なされ、各バッチごとにガバナーリミットがリセットされます。

バッチジョブをトリガーするには、Database.executeBatchメソッドを使用します。これにより、バッチジョブが非同期キューに追加されます。

Database.executeBatchメソッドには2つのパラメータが必要です:

  1. Batch Apexクラスのインスタンス。
  2. オプションのバッチサイズパラメータで、バッチごとのレコード数を指定します。指定できる最大バッチサイズは2000です。
Java

 

ID batchprocessid = Database.executeBatch(new BatchApex(),2000);

非同期Apexを使用する際のベストプラクティス

高容量プロセスでの将来の実行やQueueableメソッドのトリガー回避

Apexトリガーなど、1日の非同期制限を使い果たす可能性のあるプロセスから将来の実行やQueueableメソッドをトリガーする際には注意が必要です。これらのプロセスは利用可能な非同期リソースを迅速に消費する可能性があります。

パフォーマンスの最適化

将来の実行やQueueableメソッドのパフォーマンスが最適化されていることを確認してください。これには次のことが含まれます:

  • 処理時間を短縮するためのクエリの最適化。
  • Webサービス呼び出しの時間を最小限に抑える。
  • トリガーやフローなどの関連ロジックを合理化し、ボトルネックを防ぐ。

大容量データ向けにBatch Apexを使用

大量のレコードを処理する場合は、将来の実行やQueueableメソッドよりも常にBatch Apexを選択してください。Batch Apexは効率的に大規模なデータセットを処理するように設計されており、将来の実行やQueueableメソッドはより小規模なタスクに適しています。

Queueable Apexは柔軟性が高い

Queueable Apexは、将来のメソッドと比較してジョブの実行に対してより多くの制御を提供します。ジョブの連結や大規模なデータ処理の効率的な処理などが可能です。

結論

結論として、Salesforceにおける非同期Apexは、システムのパフォーマンスとユーザーエクスペリエンスを維持しながら、長時間実行されるリソース集約型プロセスを処理する強力なツールです。Future MethodsQueueable Apex、およびBatch Apexなど、さまざまな非同期メソッドを理解し、ベストプラクティスに従うことで、効率的でスケーラブルなソリューションを設計し、コードとシステムのリソースを最適化できます。非同期ジョブがスムーズかつ信頼性の高い動作をするようにするには、ガバナーリミット、パフォーマンスの最適化、エラーハンドリングなどの要因を考慮することが重要です。

Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview