« GitHub pagesの運用を考える | メイン | APIサーバでCORSを使う »

2014年5月14日 (水)

Heroku Connect来ました

Heroku ConnectがGAになったようです。

https://blog.heroku.com/archives/2014/5/13/introducing_heroku_connect

と言っても現状では使うためには直接コンタクトをとる必要があるようです。
以下、ざっとドキュメントを読んだまとめと感想です。節立てはドキュメントを踏襲していますが、個人的に引っ掛かったところを中心にまとめているだけで決して翻訳ではないので、ん?と思った方は原典をあたってください。(^^;


ちなみに1節読む毎に書いていたので先に書いた疑問が後で自己解決していることもあります。具体的にはINSERTに関する推測が最後に全部ひっくり返ります。直そうかとも思ったんですが、文章の流れもあるのでそのままにしました。


★ How Heroku Connect works

  • Heroku ConnectはSalesforceオブジェクトのレプリカをPostgreSQL上に作成するもの
  • テーブル名、列名はSalesforceと同じになる(ただし小文字)
  • Salesforce、DBの変更が双方向に同期する
  • SF -> DBの同期には「LastModifiedDate」列を利用する
  • DB -> SFの同期にはDatabaseのトリガーを利用する
  • DBの変更の反映はUserPermissionsとValidationRulesの影響を受ける
  • DBの変更は変更されたカラムのみが更新対象となる


これを読む限りSalesforce側になんらかのこのためのオブジェクトが仕込まれたということはなく、完全に外部からAPIの制御だけで作られているように見えます。

スキーマは常にSalesforceと完全に同じになるのかな?
そうだとすると以下の点が気になります。

  • 必要な列のみをDBに持たせることはできないのか?
  • スキーマの変更にどのように対応するのか?(最低限列の追加には対応してほしい)
  • ID列の扱いは?これがそのまま主キーになるの?


特に最後のID列の扱いは気になるところで、実はDB側ではUPDATEはできてもINSERTはできないんじゃないの?という気がします。(IDが生成できないので)
あと、DELETEの扱いはどうなるのかというのも気になるところです。

INSERTが扱えないんじゃないかと思う根拠はもう一個あって、以前にDB -> SFの片方向同期を自前で実装した時に参照(親子)関係の扱いがけっこう面倒だった記憶があるからです。

必ず親を先に同期するとか、外部キーが必要などいくつか注意すべき点があるんですが、その辺が考慮されているとはここからは読み取れません。


★ Synchronization frequency

  • デフォルトではSFの変更検知のポーリングは10分単位
  • ただしHeroku ConnectのUIを開いている間は3分になる
  • デフォルトではDBの変更検知のポーリングは5分単位
  • ただしHeroku ConnectのUIを開いている間は1分になる
  • Fast Synchモードにした場合更新頻度は30秒に一回になるがその分APIを消費する(Developer Editionの場合はほぼ間違いなくAPIを使いきる)


DBトリガーを使っているにも関わらずポーリングもあるということは、トリガーで行っているのは管理用の別テーブルへのINSERTだけでそれをまとめて更新しているってことでしょうね。5分の間に2回更新が発生したら2回のUPDATEが実行されるんですかね?(それで問題ないと思いますけど)


★ Heroku Connect and Salesforce API consumption

  • 同期オブジェクト1つにつき約500のAPIを消費する
  • リードオンリーモードの場合はAPIの消費はもう少し少ない
  • APIは更新ボリュームによってSOAPとBulkを自動的に使い分ける
  • DB -> SFで1度に更新できるのは200レコードなので10000レコードの更新は50APIを消費する
  • 初回の同期(全データコピー)は500万レコードで120分程度かかる(外部IDがない場合)


残念ながらAPIの優遇は一切ないようです。。。(--
1度に200件というのもSOAP APIの制限そのままですし。

初回120分というのはBulkを使ってもこれ位ってことですかね。(SOAPだとどう考えてももっと遅そうだし、Bulkを使わない理由がない)
スループットにすると694件/秒なのでそんなもんかとも思いますが、速いCPUのDBを使っていればもうちょっと速いんじゃないかとも思います。

外部IDの有無で性能が変わるというのはDB側でもForeign keyをちゃんと定義しているということでしょう。


★ How Salesforce objects map to Postgres database tables

  • セットアップ時にオブジェクトに対応するテーブルが自動で作られる
  • テーブル名、列名はSalesforceオブジェクトと同じ(ただし小文字)
  • DBの主キーはAuto Increment
  • SFのIDは「sfid」という列となりUnique Indexが付与される


先に書いたIDに対する疑問の回答が書かれていました。
これを読む限りやっぱりINSERTはできそうにない気がします。


★ Provisioning the add-on

  • Heroku Connectはアプリと同じリージョン(US or EU)に配置される
  • アドオンを追加したら最初にWebUIでセットアップをする
  • 設定項目は対象DB、使用するDBのスキーマ名、SF認証情報など
  • SF認証に使用するユーザーは十分な権限を持っている必要があるので連携専用のユーザーを用意することが望ましい。


ブログアナウンスでは使いたい人は直接連絡しろとありましたが、CLIのheroku addons:addで追加できるみたいですね。(試してませんが。)
日本でSalesforceを使う場合は当然日本に置くので、Herokuもとっとと日本リージョンを持ってこいっちゅー話です。

関係ないですけどCLIからアドオンの管理画面をコマンドで開けるということを初めて知りました。


heroku addons:open papertrail -a xxxx


地味に便利です。


★ Mapping objects

  • WebUIで同期するオブジェクトの設定ができる
  • SFユーザに「View All Data」と「API Enabled」の権限が必要
  • あとは一覧からポイント&クリックで設定できる
  • 同期の状態はWebUIで確認できる


どうやら同期する列も選択できるらしい。

WebUIがどの程度の情報をサポートしているのかは気になるところ。


★ Resolving read errors

認証に使用するSFユーザに十分な権限がなかったり、オブジェクトに読み取り制限がかかっている場合は同期が正しく実行できないという話


★ Accessing the synchronized tables

DB側でのデータへのアクセス方法。普通にログインしてSELECTするだけ。スキーマがデフォルトでは「salesforce」になっているのでpsqlを使う場合はsearch_pathにsalesforceを加えると良い。


★ Updating data in Salesforce

  • デフォルトはReadOnlyモードなのでDBの更新を反映するにはRead/Writeモードに変更する
  • DBの更新は<テーブル名>_trigger_logsというテーブルに記録され、それを元に更新が行われる
  • DB -> SFの更新結果は「SUCCESSFUL」「IGNORED」「FAILED」のいずれか
  • SUCCESSFULのデータはtrigger_logsから削除されるが、それ以外は残る


予想通り、DBトリガで別テーブルにINSERTしているだけのようです。
IGNOREDっていうのはどういう時に発生するんでしょうね?また、SUCCESSFUL以外のレコードは残り続けるとありますが、それがいつ消えるのかとかリトライはされないのかというのも気になります。


★ Inserting records to Salesforce

なんと!ここまでの予想を覆してDBへのInsertは可能だそうです。
どうやって実現しているかというと単純にsfid列はNULLABLEなのでそれは無視して、必要な列のみでINSERTするだけ。
あとは同期のタイミングでsfid列が自動で設定されるようです。
ちなみにINSERT後に同期が走る前にUPDATEやDELETEが行われた場合も、それらはちゃんとマージされる(DELETEの場合は何もなかったことになる)ようです。
master/detail関係のレコードも外部IDが設定されていればちゃんと反映されるとのこと。

先に書いた参照関係に対する懸念についても丁寧に説明されています。
ここに来てHeroku Connectへの評価は10段階位跳ね上がりました。(^^v


★ Using External IDs to manage relationships

AccountとContactを例に参照関係の解決のための外部IDの設定方法が書かれています。
要するにAccount側に外部ID列を追加しておけば、同期時にそれを利用することができるってことですね。

若干冗長ですが、これは仕方ないかな。。。


★ Resolving write errors

認証ユーザに十分な権限がなかったり、SFオブジェクトのValidation Rulesに引っ掛かった場合にはエラーとなる。
あるいは計算フィールドも同期可能だが、そこへの書き込みはエラーとなる。

これらのエラーはDBに記録されWebUIから確認できる。


★ Schema changes

スキーマ変更は問題なし。
列の追加はHeroku Connectの動作に何の影響もなく、その列を同期したいならマッピングを追加すれば良い。既存行の値はその時に同期される。

列の削除や変更では同期がエラーになるのでマッピングの変更が必要


★ Pausing Heroku Connect

WebUIからHeroku Connectの同期を一時的に停止できる。

オブジェクト単位ではできなくて、全体での停止しかできないらしい。


★ Import and export of configuration files

yaml形式でマッピングのインポート/エクスポートができる。
Sandboxで定義したマッピングを本番に移行する場合などに有用


★ Notifications

エラーや同期処理が60秒以内に終了しない場合などにはオーナーに対してメール通知が飛ぶ


★ Security

Heroku ConnectはSalesforceのOAuthトークンを保存している。
データ転送はすべてSSL。

ふと気になったけど、Heroku ConnectのIPは固定されるんですかね?
Salesforce側でAPIのIP制限がかかっている場合の対処方法があるのかどうかはちょっと気になるところです。


★ Using Heroku Connect and the demo Rails app

Heroku Connectを使ったRailsのサンプルアプリがあるのでまずは試してみるが良い。
このサンプルアプリではAccoutとContactを同期する
セキュリティについては特に考慮されてないので間違ってもこのデモアプリを本番環境のSalesforceで動かしてはいけない


★ Removing Heroku Connect from your Heroku app

WebUIからもCLIからも削除可能


★ FAQ
★ Support

省略。
なんかリトライする場合はtrigger_logsテーブルを直接UPDATEすれば良い、みたいなことが書かれていてなかなか衝撃的(^^;


□□□□
以上、同期処理自体はほとんど自力でやった時と同じようなものですが、WebUIで同期状況が継続的に監視できるのは良いですね。
どうでも良いけど料金体系がどこにも記載されてないような。。。

コメント

コメントを投稿

採用情報

株式会社フレクトでは、事業拡大のため、
Salesforce/Force.comのアプリケーション
開発
HerokuやAWSなどのクラウドプラッ
トフォーム上でのWebアプリケーション開発

エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみた
い方、是非ご応募下さい。

フレクト採用ページへ

会社紹介

株式会社フレクトは、
認定コンサルタント
認定上級デベロッパー
認定デベロッパー
が在籍している、
セールスフォースパートナーです。
heroku partnersにも登録されています。
herokuパートナー
株式会社フレクトのSalesforce/Force.com
導入支援サービス
弊社の認定プロフェッショナルが支援致します。
・Visualforce/Apexによるアプリ開発
・Salesforceと連携するWebアプリ開発
も承っております。
セールスフォースご検討の際は、
お気軽にお問合せください。
Powered by Six Apart