Summer '17で正式リリースされたプラットフォームイベントの有効な使い方を考えてみた #salesforce

Salesforce Summer ‘17でプラットフォームイベント(エンタープライズメッセージングプラットフォーム)なる機能が正式リリース されました。

新機能については、以下の動画で分かりやすく説明されてます。

Summer ‘17 開発者向け新機能 - YouTube

動画を見ると、このプラットフォームイベントという機能、なんとなく便利そうだなーという気がしてきます。しかし、返品リクエストのデモ(00:50あたり)だけだと、その便利さについてまだ腹落ちできませんでした*1

  • 今まででも同じようなアプリは作ろうと思えば作れるよなぁ。
  • カスタムオブジェクトでいいんじゃない?

といった疑問が残ります。

そこで、「あぁたしかにこれは便利だ!」と思えるような有効な使い方がないか、考えてみました。

免責事項

プラットフォームイベントはメッセージングの機構なので、メッセージをやり取りする主体には発行側(Pub)、購読側(Sub)があり、Pub/Subの組み合わせには以下の4パターンがあります。

Pub Sub
Salesforce Salesforce
Salesforce 外部ソース
外部ソース Salesforce
外部ソース 外部ソース

今回は3番目の、Pub=外部ソース、Sub=Salesforceのシナリオに絞った内容です。他のパターンでも(多分)有効な活用シーンが色々あるでしょう。

また、今回の話ですが、思いついたアイディアをメモ用に記事にしているだけなので、実現性については未検証です。そのうち試します(きっと)

【活用例1】大量のレコードを1個のイベントに詰めて登録し、SOAP APIコールの制限を抜ける

1個目は、「大量のレコードを最低限のAPI消費でSalesforceに登録したい」という要望を満たすために、複数のレコードをシリアライズして1個のプラットフォームイベントに詰めてPublishし、Salesforce(Subscriber)側でデシリアライズをしてからレコードを登録していく、というアプローチです。

そもそもSOAP APIコールの場合、createやupdateは1回で200レコードまでです。

developer.salesforce.com

それ以上のレコードを登録したい場合、APIコールを分けるか、Bulk APIの利用を検討する必要があります。APIコールを分ける場合、当たり前ですがAPIを余分に消費してしまいます。Bulk APIは、結果の評価を非同期で行う必要がありますし、扱いに癖があります。

やり方はこんな感じ。

  1. (Salesforce) ロングテキストエリア側のカスタム項目をもつプラットフォームイベントを作成
  2. (外部ソース) 外部ソースからAPIを利用してプラットフォームイベントをPublishする。その際、ロングテキストエリア項目に登録したいレコードをJSONシリアライズして詰めておく。
  3. (Salesforce) プラットフォームイベントのApexトリガの処理で、ロングテキストエリア項目をJSONシリアライズし、元のレコードを復元する。
  4. (Salesforce) 復元したレコードをINSERT/UPDATEする。

AWSKinesisでいう、Aggregation & Deaggregationライブラリと同じ発想ですね。割と常套手段なんでしょうか…。

【活用例2】活動(行動/ToDo)の関連先を動的に割り当てる

2個目は、「外部から登録する活動の関連先を動的に割り当てる」という要望を満たすために、直接 Event を登録するのではなく、中間にプラットフォームイベントを挟む、というアプローチです。

そもそも活動を外部からAPIで登録する場合、関連先(WhatId)項目の指定が必須であり、かつ、関連先にはSalesforce IDをセットしなければなりません。外部IDが使えないのは意外と不便だったりします。おそらく、どのオブジェクトに対する活動か、というのを術がないからだと思いますが。

間にプラットフォームイベントを挟んでしまえば、Apexトリガやプロセスビルダーで動的に関連付けができるのでは?と考えました。

まとめ

どちらの活用例にも共通して言えることは、直接 create/update するのではなく間にプラットフォームイベントをクッションとして挟むことで、柔軟性を持たせられる、ということですね。そう考えると、色々便利に使えそうな気がしてきます。

*1:ちなみにTrailheadはまだやってません…。