こんにちは。CData Software Japan リードエンジニアの杉本です。
今回はSalesforce Driver を試しているお客様から良く問い合わせを頂く、Salesforce API 制限の扱いについて解説をしたいと思います。
- Salesforce API の 制限について
- 合計API要求数要求の割当とは?
- API使用状況の確認方法
- API 要求制限に達した場合に発生すること
- CData Salesforce Driver はどのように APIリクエストを行っているのか?
- Salesforce の API Limitに抵触しないようにするにはどうしたらいいの?
Salesforce API の 制限について
Salesforce では、システムの最適なパフォーマンス維持のため、2種類のAPI制限を設けています。
一つは「同時API要求数」
もう一つは「合計API要求数要求の割当」です。
前者は同時実行されているリクエストの数、例えばマルチスレッドでデータを取得したり、処理したりする場合に気をつけなければいけない制限。
後者は24時間以内の合計APIリクエスト数の制限となっていて、大量データを取得したり、バッチ処理を行ったりする場合に注意しなければいけません。
今回は後者をメインとして、CData Driverでの扱いを解説します。
合計API要求数要求の割当とは?
前述の通り、24時間あたりの合計APIコール数に対しての制限となります。
対象のAPIは「Lightning Platform REST API、Lightning Platform SOAP API、Bulk API、Bulk API 2.0 」となっていて、各エディションやライセンス毎に以下のような制限が設けられています。(以下は2021/02時点でのキャプチャなので、正確な情報はSalesforce Helpを確認しましょう。)
API使用状況の確認方法
この合計API要求数要求の割当および消費状況はSalesforce の「設定」→「システムの概要」にある「API 使用状況」で確認することができます。
以下はSandbox環境のため、24時間の制限は15,000リクエストまで可能となっており、現在38リクエストを消費しているという状況になります。
API 要求制限に達した場合に発生すること
もしこれを超えた場合は、Salesforce API 側からエラーメッセージが返却され、24時間制限のリフレッシュが行われない限り、再度APIを経由してデータを取得したり登録することができなくなりますので、注意しましょう。
CData Salesforce Driver はどのように APIリクエストを行っているのか?
まず、誤解の無いように予めお伝えしておきたいのですが CData DriverはSalesforce のRDBに接続しているわけではありません。
何かSalesforce 側と裏口工作とかを行って、秘密裏にデータを取得しているとか、そういうわけではなく、Salesforce のAPIを活用して、CData Driverのエクスペリエンスを実現しています。
そのため、CData Salesforce Driverを使うと、上記で紹介した Salesforce API リクエスト数を消費してデータの疎通を行います。
その上で、実際にCData Driverがとのように、Salesforce API に対してリクエストを行い、API 制限を消費しているのか? を解説してみましょう。
リクエストの内容はログからも確認できますが、今回はHTTPキャプチャ・プロキシツールのFiddlerを利用して、見てみました。
それでは、いくつか例をあげて、リクエストを見てみましょう。
例えば、JDBC Salesforce Driverに対して「SELECT * FROM Account LIMIT 10」を発行した場合です。
これで取引先のデータを10件取得できるのですが、Fiddlerを確認してみると、以下のようにリクエストが飛んでいることがわかります。
「ap7.salesforce.com」のHostに対してのリクエストが今回のAPIリクエスト制限を消費するものです。LoginはSalesforce への認証処理を行うものとなっており、今回のAPIリクエスト制限の対象にはなっていませんので、割愛します。
おそらくこの記事をご覧になられている方は「1APIリクエストで済むのではないか」 とイメージされているのではないかと思いますが、実はそうではありません。
このリクエストを一つづつ紐解いてみましょう。
まず、以下のDescribeGlobalというリクエストです。これは、Salesforce 上に存在しているObjectデータをすべて取得するためのリクエストです。
CData DriverではSalesforce 上のObjectをテーブルとして扱えるようにするために、事前にどのようなオブジェクトが存在するかをチェックしています。以下のように表示されているテーブルモデルを生成するためのリクエストであると考えるのが良いでしょう。
次にdescribeSObjectというリクエストが実施されています。これはAccountオブジェクトの各種フィールド情報を取得しているリクエストになります。
1つ目と同様にCData DriverではSalesforce のMetadataを検出し、RDBライクに扱えるようにするためのスキーマ生成機能が存在します。
この処理を実施するために、対象のObject(今回はAccount)から、フィールド情報を取得しています。
最後に、Queryです。ここでようやくデータ取得のリクエストが実施されます。
予め取得していたメタデータの情報をもとに、テーブルおよびカラム構造を生成し、データ取得(SOQLでのリクエスト)を行っています。
続いて、データの登録も実施してみましょう。
「INSERT INTO Account(Name)VALUES('Hello');」というリクエストを実施してみると
今度はCreateというリクエストが1件実施されました。
いかがでしょうか。このように、CData Driverでは、1SQL=1APIリクエストという図式で成り立っているわけではありません。
なお、ここで取得していたテーブル構造やカラム構造は内部的にキャッシュされるため、SELECTクエリ発行の度に取得し直すわけではありません。INSERTを実行した時に、Metadataに対するクエリが実施されていなかったのはこのためです。
また、もし1回のAPIリクエストで取得しきれないデータがある場合は、自動的にページネーションなどの処理を行って、複数回APIリクエストを実施し、データを取得するケースもあります。
「CData DriverはどのくらいAPIリクエストを消費するのか?」という質問も良く頂くのですが、上記のように様々な係数およびユースケースがあるため、一概に応えることができないものとなっています。
Salesforce の API Limitに抵触しないようにするにはどうしたらいいの?
最後に、これもまたよく頂く質問「Salesforce の API Limitに抵触しないようにするにはどうしたらいいの?」についても、回答したいと思います。
単刀直入に言ってしまえば、抵触しないようにするためのアプローチとして、単純な解決策はありません。
そのため、現在想定しているユースケースでどのくらいAPI Limitを消費するのか? を最初に見極める必要があります。
まずは自身のユースケースに合わせたAPIリクエストを実行してみて、管理画面にてどのくらいAPIリクエストを消費しているのか、是非確認してみてください。
その上で、例えばデータの書き込みが多数の割合を締めているような場合であれば、Bulk Insertなどの一括処理や
Upsertで既存のレコードの識別を行うためのクエリを削減するようなアプローチを検討できます。
また、同じテーブルに何度もアクセスしてデータを取得し集計などを実施している、といったユースケースであれば、CData Driverのキャッシュ機能を利用したり
CDataSyncという製品を利用して、RDBやDWHに一度データをロードしてしまう、といったアプローチも有効です。
このように単純にこれを実施すれば良い、という対策はありませんが、CData Driverが標準で備えている機能を活用することで、各ユースケースごとにフィットしたクエリ方法を探ることが可能です。
もし、こういったユースケースで、APIリクエスト数を緩和したい、何か良い方法はないか? といった悩み事があれば、お気軽にテクニカルサポートまで連絡ください。