リモートコールイン
コンテキスト
Salesforce を使用して、リードの追跡、パイプラインの管理、商談の作成、リードを顧客に変換する注文詳細の取得を行っています。ただし、Salesforce システムでは注文の保存や処理は行っていません。注文は外部 (リモート) システムによって管理されています。リモートシステムは、注文が処理フェーズで渡されると、Salesforce の注文状況を更新する必要があります。
問題
リモートシステムはどのように Salesforce に接続して認証され、既存のレコードを更新するのか?
検討項目
- Salesforce へのコールでは、リモートプロセスが応答を待機してから処理を続行する必要があるか? リモートプロセスは、非同期コールのシミュレーションに必要なければ応答を破棄できますが、Salesforce へのリモートコールは常に同期された要求-返信です。
- メッセージ形式はどれか (たとえば、SOAP、REST、SOAP over HTTP、REST over HTTP など) ?
- メッセージサイズは比較的小さいか、大きいか?
- SOAP 対応のリモートシステムの場合、リモートシステムは、Salesforce が契約を指示するコントラクトファースト手法で参加できるか? これは、事前定義された WSDL が提供される、標準 Web サービス API を使用する場合は必須です。
- トランザクション処理は必須か?
- Salesforce アプリケーションのカスタマイズ耐性はどの程度か?
ソリューション
| ソリューション | 適合度 | コメント |
|---|---|---|
| SOAP API | 最適 |
|
| REST API | 最適 |
|
| Apex Web サービス | 準最適 | Apex クラスメソッドは、外部のアプリケーションに Web サービメソッドとして公開できます。これは SOAP API に代わる選択肢であり、通常は、次の追加要件を満たす必要がある場合に使用されます。
Apex Web サービスを使用する利点と、Salesforce でメンテナンスが必要な追加コードを比較して評価する必要があります。 |
| Apex REST サービス | 準最適 | Apex クラスは、それに対して定義された HTTP 動詞 (POST や GET など) を使用して特定の URI に対応付けられた REST リソースとして公開できます。 SOAP とは異なり、クライアントがサービス定義/契約 (WSDL) をコンシュームしてクライアントスタブを生成する必要はありません。リモートシステムには、HTTP 要求を作成して、返された結果 (XML または JSON) を処理する機能のみが必要です。 |
| Bulk API | バッチに最適 | Bulk API は、REST 規則に基づいており、大規模データセットの読み込みまたは削除用に最適化されています。アクセス性とセキュリティ動作は、REST API と同じです。 Bulk API では、クライアントアプリケーションは、複数のバッチを送信し、そのバッチが Salesforce によりバックグラウンドで処理されることで、大量のレコードをクエリ、挿入、更新、更新/挿入、削除できます。対照的に、SOAP API は、一度に少数のレコードを更新するリアルタイムのクライアントアプリケーション用に最適化されています。 SOAP API を使用しても多数のレコードを処理することはできますが、数百から、数千、数百万のレコードがデータセットに含まれている場合には実用性に欠けます。これは、比較的オーバーヘッドが��く、パフォーマンスが低いという特性のためです。 |
概要図
次の図は、SOAP API を使用してこのパターンを実装する場合のイベントの順序を示します。イベントの順序は、REST API を使用する場合と同じです。

結果
- リモートシステムが Salesforce API をコールして、データベースをクエリし、単独のオブジェクト操作 (作成、更新、削除など) を実行する。
- リモートシステムが、複数オブジェクトのトランザクション操作とカスタムの処理前/後ロジックをサポートできるように作成されたカスタム Salesforce API (サービス) をコールする。
| コールメカニズム | 説明 |
|---|---|
| SOAP API | リモートシステムは Salesforce Enterprise または Partner WSDL を使用してクライアントスタブを生成します。このスタブは標準 SOAP API の呼び出しに使用されます。 |
| REST API | リモートシステムは、Apex REST サービスにアクセスする前に認証を行う必要があります。リモートシステムでは、OAuth 2.0 またはユーザ名/パスワード認証を使用できます。いずれの場合も、クライアントは認証 HTTP ヘッダーと適切な値 (SOAP API へのログインコール経由で OAuth アクセストークンまたはセッション ID を取得可能) を設定する必要があります。 次に、リモートシステムは、適切な動詞で REST 呼び出し (HTTP 要求) を生成し、返された結果 (JSON および XML データ形式がサポート対象) を処理します。 |
| Apex Web サービス | リモートシステムはカスタム Apex Web サービス WSDL をコンシュームしてクライアントスタブを生成します。このスタブはカスタム Apex Web サービスの呼び出しに使用されます。 |
| Apex REST サービス | REST API のように、リソース URI と該当する動詞は、@RestResource、@HttpGet、および @HttpPost アノテーションを使用して定義されます。 |
| Bulk API | Bulk API は、REST ベースの API であるため、コールメカニズムは REST API と同じです。 |
エラー処理および回復戦略は、全体的なソリューションの一部として検討する必要があります。
- エラー処理 — すべてのリモートコールインメソッド、標準またはカスタムの API では、リモートシステムがタイムアウトや再試行の管理など後続で発生するエラーを処理する必要があります。ミドルウェアを使用して、エラー処理と回復のロジックを提供できます。
- エラー回復 — サービス品質要件で定められている場合は、カスタムの再試行メカニズムを作成する必要があります。この場合、設計特性を冪等にすることが重要です。
冪等機能によって、呼び出しを繰り返しても安全で、悪影響がないことが保証されます。冪等性が実装されていない場合、同じメッセージを繰り返し呼び出すと異なる結果になり、レコードの重複作成、トランザクションの重複処理など、データ整合性に問題が生じる可能性があります。
リモートシステムは複数回の (重複した) コールを管理して、エラーやタイムアウトの場合は、重複挿入や冗長な更新などを回避する必要があります (特に下流のトリガやワークフロールールが起動する場合)。Salesforce 内でこうした状況を管理することは可能ですが (特にカスタム SOAP および REST サービスの場合)、リモートシステム (またはミドルウェア) でエラー処理と冪等設計を管理することをお勧めします。
| ソリューション | セキュリティに関する考慮事項 |
|---|---|
| SOAP API | Salesforce は、Secure Sockets Layer v3 (SSL) および Transport Layer Security (TLS) プロトコルをサポートします。暗号鍵の長さは、128 ビット以上でなければなりません。 リモートシステムがセッション ID を取得するには、有効なログイン情報を使用してログインする必要があります。リモートシステムにすでに有効なセッション ID がある場合は、明示的なログインなしで API をコールできます。これは、このドキュメントですでに説明したコールバックパターンで使用されます。このパターンでは、先行する Salesforce アウトバウンドメッセージに含まれているセッション ID とレコード ID が後続の作業で使用されます。 クライアントは、コールごとに新しいセッション ID を取得するのではなく、SOAP API キャッシュをコールし、セッション ID を再利用してパフォーマンスを最大化することをお勧めします。 |
| REST API | リモートシステムで認証用に OAuth の信頼を確立することをお勧めします。それによって、HTTP 動詞を使用して特定のリソースに対し REST コールを実行できます。また、他の手段で (たとえば、SOAP API をコールして取得、送信メッセージ経由で提供など) 取得された有効なセッション ID で REST コールを行うことも可能です。 クライアントは、コールごとに新しいセッション ID を取得するのではなく、REST API キャッシュをコールし、セッション ID を再利用してパフォーマンスを最大化することをお勧めします。 |
| Apex Web サービス | セキュリティに関する考慮事項は、SOAP API と同じです。 |
| Apex REST サービス | セキュリティに関する考慮事項は、REST API と同じです。 |
| Bulk API | セキュリティに関する考慮事項は、REST API と同じです。 |
補足
- セッションタイムアウト — Salesforce 組織のセッションタイムアウト設定に基づいて、アクティビティがない場合、セッションはタイムアウトします。
- クエリタイムアウト — 各 SOQL クエリには、120 秒という個別のタイムアウト制限があります。
| ソリューション | 通信の種類 | 制限 |
|---|---|---|
| SOAP API または REST API | 同期 |
|
| Bulk API | 同期 |
Bulk API は、大規模なデータセットの非同期のインポートまたはエクスポート用に最適化されています。 Bulk API は、バッチ要求と関連データを送信するときは同期します。データの実際の処理は、バックグラウンドで非同期に行われます。API とバッチ処理制限の詳細は、「Bulk API の制限」を参照してください。
|
エンドポイントの機能と標準のサポートは、選択するソリューションによって異なります。
| ソリューション | エンドポイントに関する考慮事項 |
|---|---|
| SOAP API | リモートシステムは、Salesforce で事前に定義されたメッセージ形式に基づいて Salesforce SOAP API をコールするクライアントを実装できなければなりません。 リモートシステム (クライアント) は、契約が Salesforce によって提供されるコントラクトファースト実装に参加する必要があります (Enterprise または Partner WSDL など)。 |
| REST API | リモートシステムは、Salesforce で定義された REST サービスを呼び出し、XML または JSON の結果を処理する REST クライアントを実装できなければなりません。 |
| Apex Web サービス | リモートシステムは、Salesforce で定義された、事前定義形式の SOAP メッセージを呼び出すクライアントを実装できなければなりません。 リモートシステム は、Apex Web サービスが実装された後に契約が Salesforce によって提供される、コードファースト実装に参加する必要があります。各 Apex Web サービスには独自の WSDL があります。 |
| Apex REST サービス | エンドポイントに関する考慮事項は、REST API と同じです。 |
- Salesforce が、リモートシステムのリモートレコードの主キーまたは一意のサロゲートキーを保存する。
- リモートーシステムが、Salesforce の一意のレコード ID または他の一意のサロゲートキーを保存する。
この同期パターンでインテグレーションキーを処理する場合に固有の考慮事項があります。
| マスタシステム | 説明 |
|---|---|
| Salesforce | このシナリオでは、リモートシステムは Salesforce RecordId またはその他の一意のサロゲートキーをレコードから保存する必要があります。 |
| リモートシステム | このシナリオでは、Salesforce が、リモートシステムの一意の識別子への参照を保存する必要があります。プロセスは同期するため、キーは、外部 ID 項目を使用した同じトランザクションの一部として指定できます。 |
| ソリューション | 考慮事項 |
|---|---|
| SOAP API または REST API | SOAP API と REST API は、オブジェクトに対する単純なトランザクションを提供します。集約、オーケストレーション、加工など、複雑なインテグレーションシナリオは Salesforce では実行できません。これらのシナリオは、リモートシステムまたはミドルウェアで処理する必要がありますが、ミドルウェアをお勧めします。 |
| Apex Web サービスまたは Apex REST サービス | カスタム Web サービスでは、クロスオブジェクト機能、カスタムロジック、より複雑なトランザクションサポートを提供することができます。このソリューションは慎重に使用する必要があり、加工、オーケストレーション、エラー処理ロジック���どにミドルウェアが適しているか常に考慮する必要があります。 |
| ソリューション | 制限 |
|---|---|
| SOAP API、REST API、およびカスタム Apex API |
|
| Bulk API | 詳細は、補足の「データ量」を参照してください。 |
信頼できるメッセージングは、個々のコンポーネント自体が信頼できない可能性がある場合、リモートシステムへのメッセージ配信保証の問題を解決しようとします。Salesforce SOAP API および REST API は同期し、信頼できるメッセージングプロトコル (WS-ReliableMessaging など) の明示的なサポートは提供しません。
リモートシステムに信頼できるメッセージングシステムを実装して、エラーとタイムアウトのシナリオを適切に管理することをお勧めします。
次の表は、このパターンに使用されるミドルウェアシステムの望ましいプロパティの一覧です。
| プロパティ | 必須 | 望ましい | 不要 |
|---|---|---|---|
| イベント処理 | X | ||
| プロトコル変換 | X | ||
| 変換/加工 | X | ||
| キューイングとバッファリング | X | ||
| 同期伝送プロトコル | X | ||
| 非同期伝送プロトコル | X | ||
| 仲介ルーティング | X | ||
| プロセスコレオグ���フィとサービスオーケストレーション | X | ||
| トランザクション性 (暗号化、署名、信頼できる配信、トランザクション管理) | X | ||
| ルーティング | X | ||
| 抽出、加工、読み込み (ETL) | X (大量/バッチ) |
例
ある印刷関連の消耗品とサービスを提供する企業が、Salesforce をフロントエンドとして使用して取引先と商談を管理しているとします。既存の取引先の商談は、クライアントサイトのプリンタを定期的に監視するオンプレミス型のプリンタ管理システム (PMS) からの印刷使用統計情報で更新されます。商談が作成されると、アウトバウンドメッセージが PMS に送信されて新規商談が登録されます。PMS は Salesforce ID を保存します (Salesforce が商談レコードのマスタ)。
-
PMS はコントラクトファーストインテグレーションに参加できます。この場合、Salesforce が契約を提供し、PMS が Salesforce サービス (Enterprise または Partner WSDL 経由で定義) のクライアント (コンシューマ) として機能します。
-
Salesforce でのカスタム開発は行いません。
この例は、Salesforce SOAP API または REST API を使用して実装するのが最適です。
- Enterprise または Partner WSDL をダウンロードして、リモートシステムに提供します。
-
Enterprise または Partner WSDL からクライアントスタブを作成します。
-
インテグレーションユーザ (または、セッション ID が初期アウトバウンドメッセージで提供されると想定して、レコードを作成した商談所有者) のログイン情報を使用して API にログインします。
-
アウトバウンドメッセージで提供された Salesforce レコード ID に対して更新操作をコールし、関連項目の更新 (使用統計情報) を渡します。
-
Salesforce 同期 API クライアント (コンシューマ) の実装。
-
レコード更新のための Salesforce へのコールバック (前述の要求/返信アウトバウンドパターンと連携)。