2022/04/26

Salesforceのガバナ制限とは?基本からバッチ処理でのエラーの回避方法まで紹介

 
  

ガバナ制限とは?

ガバナ制限とは、特定のユーザーがサーバリソースを大きく使用し占有してしまい、他ユーザーへ影響が及んでしまうことを防ぐことを目的として行われている、リソース利用に関しての様々な制限のことをいいます。 Salesforceでの開発には、「Apex」と呼ばれるSalesforce独自のオブジェクト指向のプログラミング言語を使用して機能を実装し、Salesforceのプラットフォーム上で実行させます。Apexは、「マルチテナント環境」で実行されるため、複数の顧客ユーザーがリソースを共有しています。 そのため、それぞれのユーザーが自由にリソースを使用すると、一部のユーザーが大幅にリソースを使ってしまい、他のユーザーは残ったわずかなリソースを分け合うといった事態が起こりかねません。そういった事態を避けることを目的して、ガバナ制限は存在しています。

マルチテナント環境とは?

マルチテナント環境とは、互いに無関係な複数のユーザーが同じサーバーやデータベースといった、システムやサービスを共有して利用する方式のことです。 このマルチテナント環境の大きなメリットとして、事業者が事前に用意したシステムなどを利用するため、迅速に利用を開始することができることと、様々なユーザーと共有することで安価に利用することができるということが挙げられます。 デメリットとしては、それぞれのユーザーに合わせたカスタマイズができない、もしくは限定的であることと、各ユーザーに対しリソースを保証できず、「リソースの偏り」が生まれやすいことが挙げられます。 Salesforceでは、マルチテナント環境の大きなデメリットである、「リソースの偏り」を解消するために、ガバナ制限を設けています。

制限の対象

ガバナ制限は、マルチテナント環境のデメリットとなる「リソースの偏り」を解消するために設けられている制限ですが、具体的には何の数をカウントして制限しているのでしょうか。 具体的には、「発行されるSOQLクエリの合計数」や「SOQLクエリによって取得されるレコードの合計数」などの数で制限されます。 Salesforceは、Apex「トランザクション単位」でカウントされ、その数が一定数を超えると、実行時例外を発行するようになっています。 Apex一括処理をする場合であれば、これらの制限はexcuteメソッドでレコードのバッチの実行ごとにリセットされるようになります。

トランザクション単位とは

トランザクション単位とは、簡単に説明すれば、一連の複数の処理を一つのものとして処理する時の、一つのまとまりのことを指します。 トランザクションが必要となる場合を、「銀行口座を利用したお金の移動」を例にして説明します。 Aさんが自分の銀行口座である「口座A」から、友人の銀行口座である「口座B」へ1万円の送金を行うとします。ここで行われる処理は、「1.口座Aの残高から1万円を引く」「2.口座Bの残高を1万円増やす」という2つの処理になります。 これらの処理を別々に行ってしまうと、もし1つ目の処理のみが成功し、2つ目の処理が失敗した時、口座Aから引かれた1万円は口座Bへ入ることなく消えてしまい、2つの口座で不整合が起きてしまいます。当然ですがこのような不具合があれば問題となります。 そこでトランザクション単位で処理をすることにより、この問題を解決します。 トランザクション単位では、「口座Aの残高から1万円を引く」と「口座Bの残高を1万円増やす」という2つの処理を一つのものと考えます。そのため、2つの口座の間に不整合が起こらなくなるのです。

バッチ処理を利用したガバナ制限エラーの回避方法

ガバナ制限を受けそうな大量のデータを扱う処理を実装するのであれば、Apexの一括処理(バッチ処理)を検討することをお勧めします。 非同期での実行しかできなくなるなど一定の制限はありますが、ガバナ制限が緩和されるため、大量のデータ処理を行う際に効果的です。 一括処理をするには、Salesforceが提供するインターフェース「Database.batchable」を実装するApexクラスを記述して、次にプログラムでクラスの呼び出しを行います。 [Apex ジョブ]を選択することで、一括処理ジョブの実行を監視または停止することができます。

Salesforce「Database.Batchableインターフェース」の実装

Database.Batchableインターフェースには、これから紹介する3つのメソッドが含まれています。

startメソッド

startメソッドは、Database.QueryLocatorオブジェクトや、Iterableオブジェクトの中でも、ジョブに渡すレコードやオブジェクトが含まれるものを返すものです。 このメソッドは、レコードやオブジェクトを、インターフェースメソッドであるexcuteに渡す際、Apex一括処理ジョブのはじめに利用されます。 SELECTなどの単純なクエリを使用し、一括処理ジョブのオブジェクトの範囲を生成するには、Database.QueryLocatorオブジェクトを使用します。 このオブジェクトを使用することで、SOQLクエリにより取得されるレコード合計数に対してガバナ制限はスルーされるため、リソースの確保に大いに貢献します。
global (Database.QueryLocator | Iterable) start(Database.BatchableContext bc) {}

excuteメソッド

excuteメソッドは、メソッドに渡すレコードのバッチごとにコールされ、Database.BatchableContextオブジェクトへの参照や、sObjectsのリストやパラメータ化された型のリストなどを取得します。 このメソッドは、データの処理単位ごとに必要な処理を実行する時に利用されます。
global void execute(Database.BatchableContext BC, list
){}

finishメソッド

finishメソッドは、確認メールの送信などの操作を行う場合に使用されます。 このメソッドには注意点が一つあり、すべてのバッチが処理された後に、このメソッドがコールされる、ということです。
global void finish(Database.BatchableContext BC){}

ガバナ制限について理解を深め、リソースの確保を!

今回はガバナ制限について解説しました。 Salesforceを利用する時に避けては通れない「リソースの確保」という課題を解決するためにも、ガバナ制限についての理解をより深めていきましょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】