Heroku Connect を使用した Salesfore へのデータの書き込み
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年12月01日(木)
Table of Contents
データベースと Salesforce 組織の間で最も効率的にデータを転送する方法が、Heroku Connect によって自動的に選択されます。データの変更量と、Salesforce API 操作の詳細を考慮に入れたベストプラクティスが採用されます。この記事では、Heroku Connect で Postgres から Salesforce にデータを書き込む方法について説明します。
変更のポーリング
Heroku Connect では、pg_notify
トリガーからの更新を検出しない限り、Heroku Postgres データベースの更新を 2 分おきにポーリングします。これらのポーリングは最短でも 10 秒おきに制限されています。データベースをポーリングして変更を検出すると、Connect は Salesforce への変更の書き戻しを開始します。これらの間隔は設定できません。1 セットの書き込みが完了すると、新しいポーリングサイクルが始まり、2 分間または pg_notify
からの新しい変更イベントを待機します。
Salesforce への書き込み操作が進行中の間、Heroku Connect は追加のデータベース更新をポーリングしません。さらに、すべてのマッピングにわたって順番に連続で書き込み操作を実行します。ある書き込みのセットを別のセットよりも優先するメカニズムはありません。
Connect で Salesforce に書き込む方法
Heroku Postgres で行われた変更が、Heroku Connect によって読み取り/書き込みマッピングに捕捉され、Salesforce に送信されます。
読み取り/書き込みテーブルが更新されると、Postgres トリガーが発動し、_trigger_log
(トリガーログ) テーブルへの挿入によって変更が捕捉されます。すべての読み取り/書き込みデータテーブルは、Heroku Connect アドオンごとに 1 つの _trigger_log
テーブルを共有します。詳細は、Heroku Connect のトリガーログに関する記事を参照してください。
捕捉されたすべての変更は、Heroku Connect によって、アドオンごとに 1 つのプロセスで処理されます。書き込みアルゴリズムやその他の要件に応じて、SOAP または Bulk API を使用して Salesforce に変更が送信されます。詳細は、SOAP と Bulk API の選択に関する項目を参照してください。この単一の書き込みプロセスは、マップされたオブジェクトに対する Salesforce からの読み取りからは独立して、またそれと同時に実行されます。
TRUNCATE
操作は _trigger_log
テーブルに捕捉されません。Salesforce で個別にレコードを削除してください。
Connect はトランザクション境界内の変更を監視できず、データベースで発生したとおりの厳密な書き込み順序を強制することはできません。
書き込み可能でない列もあります。詳細は、「システムフィールド: 読み取り専用の列」を参照してください。
デフォルトでは、Heroku Connect が Salesforce にデータを書き込むとき、割り当てルールは実行されません。リードとケースに対してデフォルトの割り当てルールを有効にする場合は、サポートチケットを作成してください。複数の接続がある場合は、接続ごとに設定を有効にできるよう、必ずそのことをお伝えください。
SOAP と Bulk API
双方向 (“読み取り/書き込み”) の同期が設定されている場合、Heroku Connect では SOAP または Bulk API を使用して Salesforce に変更を書き込みます。これらの API 呼び出しは、Salesforce API の制限までのカウントには含まれません。
Bulk API は、サイズの大きいデータセットに適用される操作に最適化されています。これらのシナリオでは、SOAP API を使用するよりも高速です。次のすべての条件が満たされている場合、Connect では自動的に Bulk API の使用を試みます。
- 順序付き書き込みアルゴリズムを使用するように接続が設定されている。
- 一意の識別子がマッピングに指定されている。
- 2,000 ~ 10,000 件連続した同じタイプ (
INSERT
、UPDATE
、またはDELETE
) の変更が特定のオブジェクトに対して行われる (例: “Lead” オブジェクトへの 5000 件の INSERT)。 - 接続用の Salesforce API のバージョンが v39 以上に設定されている。
Bulk API を使用して 10,000 件を超えるレコードの変更を書き込むとき、レコードは 10,000 件単位でバッチ処理されます。
次の場合、Heroku Connect では、SOAP API を使用して Salesforce 組織に変更を書き込みます。
- 処理されるレコードが 2,000 件より少ない。
- Bulk API を使用する条件が満たされていない。
Heroku Connect では、できるだけ多くのレコード (最大 200 レコード) を 1 つの SOAP メッセージに詰め込もうとします。
読み取り専用マッピングread-only mappings](https://devcenter.heroku.com/articles/reading-data-from-salesforce-with-heroku-connect#api-call-usage)では、レコード数とバッチサイズのしきい値が異なります。
書き込みアルゴリズム
Heroku Connect では Salesforce への書き込み時に、順序付き書き込みとマージ書き込みの 2 つのアルゴリズムをサポートしています。このユースケースで Salesforce への書き込みが最も効率的なアルゴリズムを選択します。接続の書き込みアルゴリズムは、Manage Connection (接続の管理) ページで確認および選択できます。
順序付き書き込みアルゴリズムは、Bulk API を使用するための前提条件です。マージ書き込みアルゴリズムを使用している場合、Salesforce への一括書き込みを実行できません。
書き込みアルゴリズムの選択は、接続レベルで行われます。すべての読み取り/書き込みマッピングで、同じ書き込みアルゴリズムが使用されます。
順序付き書き込みアルゴリズム
Heroku Connect では、すべてのレコード変更をトリガーログに捕捉します。順序付き書き込みアルゴリズムは、デフォルトで使用されるアルゴリズムです。レコードをメッセージに詰め込む効率が低下する場合でも、トリガーログからの変更の順序を常に保持します。順序付き書き込みアルゴリズムの優位性は、個別の操作として個々の変更を捕捉することです。Salesforce オブジェクトの履歴には、これらの変更が反映されます。
順序付き書き込みアルゴリズムの潜在的な落とし穴
同じレコードを短時間のうちに更新すると、個々の変更が個別に処理されるため、結果として同期速度が低下する可能性があります。
多数のオブジェクトに短時間で連続して書き込んだり、操作対象のオブジェクトが頻繁に切り替わったりした結果、Bulk API ではなく SOAP API が使用されることはよくあります。Heroku Connect では、Salesforce に送信される個々のメッセージをできるだけ圧縮しようとします。ただし、Salesforce SOAP API の書き込みルールには従う必要があります。1 つのメッセージに詰め込める変更のチャンク数には制限があります。データを Salesforce に同期するための API 呼び出しは、そのマッピングによってグループ化されます。異なるマッピングに短時間で連続して行われる変更が増えるほど、API 呼び出しの必要回数も増え、結果として同期速度が低下します。多数の同時データベース書き込みによって、この状況がさらに悪化する可能性もあります。
加えて、順序付き書き込みの使用時は、INSERT が失敗すると、訂正アクションが実行されてそのレコードが再送信されるまでの間、後続の更新はすべて失敗します。すべての変更が順番に処理されるため、1 回でも失敗すると解決されるまでキューが停滞します。詳細は、Heroku Connect の書き込みエラーに関する記事を参照してください。
マージ書き込みアルゴリズム
マージ書き込みアルゴリズムでは、トリガーログの変更の圧縮と並べ替えを行い、各 SOAP メッセージのレコード数を最大化します。順序付き書き込みでは変更の順序を保持しますが、短時間のうちに多数の変更を連続で行う場合、通常はマージ書き込みのほうがパフォーマンスが高くなります。
たとえば、Account.firstname
の値を Nathaniel
に設定し、直後に Nate
に更新するとします。マージ書き込みでは、Account.firstname = Nathaniel
の最初の更新は、直後の更新によって上書きされるため、Heroku Connect によって破棄されます。この動作を、Account.firstname
への両方の変更が処理される順序付き書き込みと比較してみてください。
マージ書き込みアルゴリズムの潜在的な落とし穴
マージ書き込みアルゴリズムでは、更新の順序を入れ替えることで関係の依存関係を解決しようとします。ただし、すべてのケースで正しい順序を選択するとは限りません。循環依存関係によって問題が起きることが知られています。さらに、関係の種類によっては、変更のマージによって関係を確実に確立できなくなる可能性があります。
Apex トリガーとプロセスルールが Salesforce にある場合、このアルゴリズムの使用には注意してください。このアルゴリズムによって一部の変更セットがマージされるため、データベースで行われたすべての変更を認識できることは保証されません。
マージ書き込みアルゴリズムでは、失敗した挿入の再送信を後続の更新時に試みますが、これによって一部のエラー回復ケースが簡略化されます。
マージ書き込みアルゴリズムを使用している場合、Salesforce への一括書き込みを実行できません。Bulk API の用途には順序付き書き込みアルゴリズムを使用してください。
必要な Heroku Postgres 接続
Heroku Postgres のプランごとに接続制限があります。
Heroku Connect では、マッピングあたり 1 つの接続を使用してレコードを読み取ります。マッピングのいずれかが読み取り/書き込みである場合、Salesforce へのすべての書き込みを処理するために 1 つの追加接続を使用します。読み取り/書き込みマッピングの数にかかわらず、書き込みには 1 つの接続のみが使用されます。たとえば、20 のマッピングがあり、そのうち 5 つが読み取り/書き込みである場合、Heroku Connect では Postgres データベースへの 21 の接続を使用します。
オブジェクト関係の処理
オブジェクト間に設定できる関係にはいくつかの種類があります。関係の設定方法については、Heroku Connect でのオブジェクト関係の処理に関する記事を参照してください。
トリガーログの理解
Heroku Postgres のレコードに加えられた変更はトリガーログに捕捉されます。Heroku Connect では、トリガーログを使用してデータを Salesforce に送信します。詳細は、Heroku Connect のトリガーログに関する記事を参照してください。
書き込み同期の問題の防止
短時間のうちに同じフィールドを複数回更新すると、同期の問題が発生する可能性があります。場合によっては、重複したレコードが Heroku Connect によって作成される可能性もあります。これらの問題の防止に関するヒントは、Heroku Connect での重複レコードの問題および Heroku Connect で短時間に複数回の更新を行った場合の問題に関する記事を参照してください。
書き込みエラー
計画的なメンテナンス期間などのさまざまな理由で、Salesforce への書き込みが失敗することがあります。Salesforce が利用できない場合、再び利用可能になるまで Connect は書き込みをキューに入れます。それ以外のすべてのケースでは、エラーを解決するためにユーザーの介入が必要です。詳細は、Heroku Connect の書き込みエラーに関する記事を参照してください。
大量のデータを読み取り/書き込みマッピングにインポートする
いくつかの要件を満たした場合、Connect では、Salesforce Bulk API を使用して Heroku Postgres から Salesforce に変更を書き込みます。Connect でどのような場合に Bulk API を使用するかの詳細は、「SOAP と Bulk API」のセクションを確認してください。Data Loader などのツールを使用して Salesforce に直接、データをインポートすることもできます。
Heroku Connect でのカスタムトリガーの使用
カスタムトリガーは正式にサポートされておらず、Heroku サポートで支援を提供することもできません。ご自身の責任でご利用ください。
Heroku Connect では、Connect テーブルの変更を監視して変更を Salesforce に書き込むために Postgres トリガーを使用します。Connect のテーブルで独自のカスタムトリガーを実装すると、負荷が増加し、Connect で更新の取りこぼしが発生する可能性があります。詳細は、「Heroku Connect でのカスタムトリガーの使用」を参照してください。
Postgres のデータが Salesforce と一致しない理由は?
いくつかのシナリオでは、Postgres 内のデータが、Salesforce に書き込まれたデータと正確に一致しません。
- Salesforce は、文字列の先頭と末尾から余計なスペースを削除します。
- 文字列値が空の場合、Salesforce API はその値を NULL として送信します。したがって、Salesforce から値を再同期すると、そのように処理された形で Postgres に格納されます。この動作は、Heroku Connect の制御が及ばない Salesforce API の一部です。
- Postgres では、数値は 15 桁の精度を持つ
double
列として格納されます。この制限を超える Salesforce の値も Heroku Connect 経由で同期されますが、精度は低下します。大きい値では、この差が顕著になる可能性があります。
判明したパフォーマンスの問題の診断
Heroku Connect での同期のパフォーマンスには、多くの要因が影響する可能性があります。Heroku Connect のパフォーマンスの問題の診断に関する記事の手順に従って、認識された書き込みパフォーマンスの問題を診断してください。