Force.comのようなPaaS上でアプリケーションを開発するとき、オンプレミスのシステムと大きく異なっているのが、一度に利用できるシステムリソースに制限が設けられていることです。Force.comではこれを「ガバナ制限(Governors and Limits)」と呼んでいます。第2回と第3回では、ガバナ制限をうまく回避するためのテクニックを紹介します。

 PaaSでは、複数の組織が共通のシステム基盤を利用しています。この共通のシステム基盤上で特定の組織がリソースを専有すると、他の組織に悪影響を与えてしまいます。このためPaaSでは、組織ごとに利用できるシステムリソースに制限を設けています。米GoogleのPaaS「Google App Engine」にも、Force.comと似たような制限があります。

 PaaSの魅力はそもそも、システム基盤を共有していることから生まれています。複数の組織が共通のシステム基盤を使うことにより、クラウド事業者はシステム基盤全体としての構築・維持コストを下げられます。このためサービス料金を抑えることが可能になり、ユーザーはそのコストメリットを享受できます。またユーザーは、システム基盤の構築・運用を事業者に任せられるため、システムの短期導入が可能になります。小規模から初めて、徐々に適用規模を拡大することもできます。

 ガバナ制限は確かに開発者にとって厄介なものですが、上記のようなPaaSの魅力を享受するには、必要不可欠な制約といえます。なお、ガバナ制限は固定的なものではありません。Salesforce.comは過去の実績データを基にシステムの増強を続けており、それに合わせてガバナ制限も徐々に緩和しています。

 Force.com(Spring '11バージョン)のガバナ制限の詳細を表1に示します。WebサービスのクライアントやWebブラウザーからの1回のリクエスト処理で超えてはいけない、データベースアクセス回数や実行ステップ数などが規定されています。これらの制限を避けるテクニックを紹介していきます。

表1●主なガバナ制限(Spring '11バージョン)
Force.comのバージョンアップのたびに緩和される傾向にあるので、最新情報はWebサイトで確認してほしい。
項目上限
SOQL(Salesforce Object Query Language)クエリーの発行可能数 *1100
1回のSOQLクエリーで取得可能なレコード数 5万
SOSL(Salesforce Object Search Language)クエリーの発行可能数20
1回のSOSLクエリーで取得可能なレコード数 200
DML操作の発行可能数*2150
DML操作、プロセスの承認、「ゴミ箱を空にする」などで処理可能なレコード数 10000
実行可能なコードステートメント数 20万
合計ヒープサイズ*33Mバイト
トリガーで再帰的に実行されるApexの深度*416
forループで使用するリストのバッチサイズ 200
1リクエスト当たりのコールアウト(HTTPリクエストまたはWebサービスの呼び出し)総数10
1リクエストあたりのコールアウトの合計リクエスト可能時間 120秒
コールアウト1回のデフォルトタイムアウト10秒
カスタムコールアウト1回の最大タイムアウト60秒
1回のApex実行で呼び出し可能なfutureアノテーションを持つメソッドの数10
コールアウトのリクエストあるいはレスポンスの最大サイズ*53Mバイト
1回のApex実行で呼び出し可能なsendMailメソッドの数 10
describes関連メソッドの実行可能数*6100

*1 親-子または子-親のサブクエリーを含む場合は、追加のクエリーとしてカウントされる。ただし、そうしたクエリーについては上限が3倍に引き上げられる
*2 カウントされるDMLステートメントには以下のがある。Approval.process、database.emptyRecycleBin、deleteおよびdatabase.delete、findSimilar、insertおよびdatabase.insert、merge、rollback、runAs、setSavePoint、updateおよびdatabase.update、upsertおよびdatabase.upsert
*3 バッチApexのヒープサイズは6Mバイト、電子メールサービスのヒープサイズは18Mバイト
*4 insert、update、delete文による、トリガーの実行を伴わない再帰的なApex呼び出しは同一の処理階層として扱われる。一方、トリガーにより起動された再帰的なApex呼び出しは、トリガーを起動した呼び出しとは別の呼び出しとして扱われる
*5 HTTPリクエストとレスポンスのサイズは合計ヒープサイズの一部として計算される
*6 describes関連メソッドには次のメソッドの実行とオブジェクトへのアクセスが含まれる。ChildRelationship objects、RecordTypeInfo objects、PicklistEntry objects、fields calls