Heroku Connect のパフォーマンスの最適化
最終更新日 2023年06月29日(木)
Table of Contents
同期のパフォーマンスには接続ごとに大きな差があります。パフォーマンスを判断する最良の方法は、本番環境の Salesforce 組織と本番環境データベースプランを使用してテストすることです。この記事では、Heroku Connect の同期速度を最適化する方法を示します。Connect インスタンスのパフォーマンスを向上させるには、Heroku Connect、Heroku Postgres、および Salesforce に関する次のヒントに従ってください。
この記事は、Heroku Connect の基本を理解していることを前提としています。Heroku Connect を使い始めたばかりの場合は、Heroku Connect のメインページを参照してください。
Premier または Signature Success Plan の Heroku Enterprise の顧客は、Customer Solutions Architecture (CSA) チームに、このトピックに関する詳細なガイダンスを要求できます。ここでエキスパートコーチングセッションについて学習するか、または Salesforce の担当者にお問い合わせください。
Heroku Connect
大規模なデータセットには Salesforce Bulk API を使用する
Heroku Connect は、Salesforce Bulk API または Salesforce SOAP API を使用します。Bulk API は、データセットが大きいほど高速です。
Bulk API を使用できるように、少なくとも Salesforce API v39 を使用してください。「Finding your Salesforce API version」(Salesforce API のバージョンの確認) を参照してください。
各 API が使用される場合の条件を確認し、Bulk API を使用する書き込みパターンに従います。
- 同期される変更の数を最小限に抑えます。
- 変更されたレコードのみをマッピングされた Heroku Connect テーブルに保存します。変更されていないレコードを保存すると、不要な同期がトリガーされます。
- 短期間に何度もレコードを更新する予定の場合は、ステージングテーブルをすばやく変更し、安定した後でレコードをマッピングされたテーブルに移動します。たとえば、Rails アプリでは、
after_save
ではなくbefore_save
コールバックでルックアップと計算を処理します。その後、すべてのデータが 1 つの SQL ステートメントでデータベースに書き込まれます。
- 有効なデータのみを挿入します。挿入に失敗すると、Bulk API の使用から SOAP API へのフォールバックが発生します。Heroku Connect のログで、たとえば
BULK write batch to MAPPING_NAME ended due to REASON Will fall back to SOAP
のようなメッセージに注意してください。
詳細は、Bulk と SOAP APIを参照してください。
ユースケースに最適な書き込みアルゴリズムを選択する
Heroku Connect が双方向の同期で設定されている場合、ユースケースに効率的な書き込みアルゴリズム (順序付き書き込みまたはマージ書き込み) を決定します。
一般に、連続して多くの急速な変更を行う場合は、マージ書き込みの方がパフォーマンスが向上します。循環依存関係がある場合、または Salesforce で Apex のトリガーまたはプロセスルールを使用する場合は、マージ書き込みを避けてください。順序付き書き込みアルゴリズムは、Bulk API を使用するための前提条件です。マージ書き込みアルゴリズムを使用している場合、Salesforce への一括書き込みを実行できません。
各アルゴリズムの潜在的な落とし穴を注意深く確認して、ユースケースに最適なものを選択してください。
マッピングされたオブジェクトのサイズを最小限に抑える
マッピングされたオブジェクトを小さくして、Salesforce へのリクエストのサイズを最小限に抑え、同期速度を向上させます。
- ユースケースに必要な最小数のフィールドを選択してください。Heroku Connect は Salesforce からデータをプルするとき、レコード全体を一度に読み取ります。多くのフィールドがマッピングされると、パフォーマンスが大幅に低下することがあります。
- マッピング内の大きな文字列フィールドとテキストフィールドの数を最小限に抑えます。Salesforce API では、応答のサイズまたは生成されるバルク結果ファイルのサイズに制限を設けています。長いテキスト領域またはリッチテキスト領域であるマッピングされたフィールドは、大量のデータを保持する傾向があります。したがって、それらのフィールドがマッピングされていない場合に比べて、データをフェッチするために Heroku Connect が実行する必要があるネットワークリクエストの回数が大きく増加します。Salesforce の API のクエリに余計な時間がかかるため、マッピングにこれらのフィールドが含まれていると Heroku Connect のパフォーマンスが低下します。パフォーマンスのペナルティは、これらの大きなテキスト領域フィールドが複数あるマッピングでしか発生しません。
Heroku Connect の診断は、接続に最適なオブジェクトごとのマッピングの数とフィールドの数を特定するのに役立ちます。heroku connect:diagnose
を実行し、フィールドの数と大きなテキストエリアフィールドの数の診断チェックを確認します。これらのチェックに黄色または赤色のフラグがある場合は、マッピングを確認し、可能であればマッピングされるフィールドの数を減らしてください。
マッピングへの頻繁な変更を避ける
大きなテーブルに新しいフィールドを追加すると、一括ジョブが発生して、新しいフィールドが空でない場合は、対応するデータベース列に Salesforce データがバックフィルされます。Salesforce から Heroku への通常の同期プロセスは、一括ロードが完了するまで一時停止され、これにより Heroku Connect の速度が低下します。
すでに多数のレコードがマッピングされているテーブルの場合は、新しいフィールドが同期されている間、データが古くなっているように見えることがあります。
マッピングを変更する前に、すべての関係者に必ず通知してください。マッピングを更新すると、Salesforce からデータベースに新しいデータを同期するときに遅延が発生する可能性があるため、関係者は変更とタイムフレームについて知っておく必要があります。関係者には、開発者、Salesforce 側のチーム、およびこのデータに依存するその他のビジネスチームが含まれます。
Heroku Connect スキーマへのアクセスを避ける
Connect スキーマには、Connect によって同期されたテーブルのみを保存してください。余分なテーブルがあると、捕捉された変更を処理および無視しようとする間、Connect の速度を低下させる可能性があります。
新しい制約の追加など、マッピングされたテーブルの定義を変更すると、Salesforce がデータを同期または削除しようとしたときに問題が発生する可能性があり、同期の問題が発生することがよくあります。これらの同期の問題に対する可能な解決策については、「Heroku Connect mapping is stuck in ‘Altering DB schema’ status」(Heroku Connect マッピングが「DB スキーマの変更中」ステータスでスタックしている) を参照してください。
Heroku Connect でのカスタムトリガーの使用を制限してください。Heroku Connect テーブルに独自のカスタムトリガーを実装すると、更新が失われたり、データベースの負荷が増加したりする可能性があります。
Heroku Postgres
有効なデータのみを挿入する
Salesforce と Heroku Postgres には、失敗した INSERT に対して同様の制約があります。Salesforce 側でエラーが発生する Postgres への挿入は、リクエストが Bulk API から SOAP API に移動されるため、速度が大幅に低下する可能性があります。ログでエラーを確認して、データを修正してください。Salesforce API ドキュメントには、エラーコードとその説明の完全なリストが含まれています。
適切な Heroku Postgres のプランを選択する
本番環境の Connect ユースケースでは、少なくとも standard-4
、premium-4
、private-4
、または shield-4
プランを使用してください。下位のプランでは、次の理由でパフォーマンスの問題が発生することがよくあります。
standard-4
、premium-4
、private-4
、またはshield-4
よりも低いプランで並列実行アクティビティのパフォーマンスが不十分。Heroku Connect で並列実行アクティビティを処理するには、4 vCPU 以上のデータベースプランを推奨します。- 接続制限。
-4
より小さい Postgres のプランの中には、接続制限が 500 未満であり、接続の喪失につながる可能性があるものもあります。
データベースプランをアップグレードして、Heroku Connect のニーズに合わせてスケーリングしてください。同期される行が増えるにつれて、より多くのリソースが使用されます。大規模な Heroku Connect のユースケースの場合は、次のようになります。
- 1,000 万~ 1 億行を同期するには、
-5
または-6
データベースが推奨されます。 - 1 億を超える行を同期するには、少なくとも
-7
データベースを使用します。
データベースのパフォーマンスに影響を与える要因は、同期される行の数だけではありません。これらのガイドラインはほとんどのユースケースに適していますが、パフォーマンスの問題について Postgres を監視して、それらが適切かどうかを確認してください。詳細なガイダンスについては、Heroku Postgres の監視を参照してください。
Postgres のパフォーマンスの問題に注意する
Postgres データベースのヘルスは、Connect の同期速度に影響します。
これらのパフォーマンスの問題は、Connect に特定の影響を与える可能性があります。
- 未使用のインデックス。インデックスは書き込み中にパフォーマンスの低下を招くため、最高のパフォーマンスを確保するために未使用のインデックスを削除してください。
- データベースの肥大化。肥大化は、まだ回収されていないデッドタプルの関係に割り当てられたスペースです。比率が 10 を超える肥大化のテーブルを調査してください。
- 過剰な接続。接続数が多いデータベースの場合は、PGBouncer などの接続プールまたは別のデータベースを使用してください。
- スキーマの数。50 未満のスキーマが推奨されます。スキーマが多すぎると、Postgres のパフォーマンスと論理バックアップを正常に実行する機能に影響を与える可能性があります。
pg:diagnose で問題をチェックし、黄色または赤色で返されるチェックを調査してください。パフォーマンスの問題への対処の詳細は、「Heroku Postgres の監視」および「Heroku Postgres データベースのチューニング」を確認してください。
Salesforce
Connect 専用の Salesforce 統合ユーザーを作成する
Connect で使用するために、Salesforce で個別の専用統合ユーザーを作成します。
統合ユーザーに「すべてのデータの表示」権限を付与して、リクエストされたレコードに対する Salesforce 権限チェックを排除します。
Connect の統合ユーザーは、同期パフォーマンスを向上させるためにのみ採用してください。同時クエリなどのユーザーごとの制限により、同期速度が低下する場合があります。
Salesforce レコードのロックを最小限に抑える
Salesforce レコードのロックを最小限に抑えると、Heroku Connect の同期速度が向上し、同期の失敗が減少します。
Apex のトリガー、プロセスビルダー、およびフロー/ヘッドレスワークフローにより、Salesforce レコードがロックされる可能性があります。このような場合、Connect はロックが解除されるのを待ち、同期を遅らせます。行をロックするときは、デッドロックが発生しないように注意してください。アプリケーション内のすべての場所から同じ順序でテーブルと行にアクセスして、標準のデッドロック回避手法を使用していることを確認してください。詳細は、「レコードのロック」を参照してください。