yonet77的な雑記帳

日々思いついたネタなどを書き留めておきます

Code[ish] jp で少しお話ししました

先日、 Code[ish] JP - ポッドキャスト | Heroku で少しお話しさせて頂く機会がありました。

僕の方は、主にtech系のネタをメインにしていたのですが、「あーそういえば」ということがありましたので、その辺りを補足しようかな、と思います。


Heroku Connect の所感とか悩みどころとか

Salesforce + Heroku 案件で Heroku Connect を使う機会があって、その中で気付いたことなどをもう少しを掘り下げようと思います。


1. 同期するレコード件数は事前に見積もる

Heroku Connectの課金体系は、同期するレコード件数に応じて段階的に課金が発生する(詳細はSalesforceの営業さんに)という具合です。
そんなわけで、例えば今後5年間で同期レコード件数の規模を見積もっておいて、お客さんとは大体のところで合意しておかないと、後でこんがりと燃え上がる...かもしれません。
(知らんですが)


2. Salesforce側のオブジェクトにあるレコードの一部を同期したい

現在のHeroku Connectの仕様上、どーにもならないので頭を切り替えましょう、としか言えない話だと思います。

レコードの一部を同期させたいとなると、こんなところが思いつくと思いますが、結局のところは連携用のオブジェクトを用意することになる(「1.」)と思うので、ガリガリとApexトリガを書いてます...

  1. 業務上で使用するオブジェクトとは別に、Heroku Connectの連携用として新たなオブジェクトを用意して、業務で使用するオブジェクトと、連携用のオブジェクトをSalesforce内で同期させる(トリガとか使う...など)
    • f:id:yonet77:20200914100946p:plain
  2. 接続するユーザに共有設定をつけてレコードを絞る
    • ただし、heroku側は"View All"が必要と記載しているので、試してみても良いけれど運用上はNGでしょう。。。(知らんですが)
    • devcenter.heroku.com

 

3. 連携するオブジェクトに、変な入力規則とかつけてると連携エラーが頻発してツラい

Salesforce側のオブジェクトは、Heroku Postgresとのデータ連携のゲートウェイになるので、できることならデータはそのまま連携されることが望ましいと思います。「2.」とも少し関連しますが、連携用のオブジェクトから業務で使用するオブジェクトにデータを書き込む際に、業務上のロジックをかませて必要に応じてエラー通知させる(カスタム通知とか、特定のchatter groupに投稿するとか)のが良いのかなぁと考えてます。

Heroku Connectにて、エラーからの回復方法は、こんなところで紹介されていますが、 _trigger_log テーブルをいじるのは意外に面倒かな、とも思います。
devcenter.heroku.com

そんなわけで、Salesforce側の連携用オブジェクトには、あんまり入力規則とかフローとか入れない方が良いと考えています。

f:id:yonet77:20200914111452p:plain


4. 選択リスト値のAPI値だけ連携されるけど、実はラベルも欲しい…

Salesforce側で連携するオブジェクトに選択リスト値(単数/複数)を定義することもあると思います。
そして、選択リストのAPI値とラベル値が異なる(API値は英数字のみ、ラベル値は日本語表記 など)こともあると思います。

この時、当たり前の話ですが...Heroku Postgres側にはAPI値だけが連携されて、ラベル値は連携されません。
Herokuで稼働させるWebアプリケーションで値を表示させたい、となるとラベル値も一緒に連携させたいですね。
(さらに言えば、API値とラベル値のセットも一緒に同期してほしい...けど、それはさておき)

結局、API値とラベル値の両方を連携させる必要がある場合には、

  • ラベル値を格納するためのテキストフィールドを作っておく
  • Apexトリガなどでラベル値を生成して、そのテキストフィールドにセットする

といった工夫が要るのかな、と思います。

f:id:yonet77:20200914113027p:plain

ただ、API値とラベル値が一致している場合には、この限りではありませんね。


5. その他

2つのDB間を高頻度にデータ連携する仕組みということもあり、色々と非同期処理を前提にした設計が必要かな、と思うあたりでしょうか。
Salesforce側で数式定義している項目がHeroku Postgresまで浸透するには時間がかかるよ、など。

そして、やはり便利ですね。使いどころを間違えなければ、非常に強力なサービスだと思います。シンプルですし。

あとはちょっと試してみたいな、と思うあたりでは...

  • 複数のHeroku Connectをプロビジョニングして(Connect "A", "B", "C" とします)、1つのSalesforceと繋げる
  • サイト"A" にはConnect "A"
  • サイト"B" にはConnect "B"
  • サイト"C" にはConnect "C"

という具合にすると、複数種のサイトを構築できたりするのかな、と。
(どんなユースケースだ?)

おわり

ゲスト出演してから、結構時間が経ってしまいました。。こういうのはサクッと書けるようになりたいな、と思う今日この頃です。


今後もHeroku Connectと、もっとキャッキャウフフして様々な可能性を探っていきたいな、と思います。
(たぶん