MuleSoftとPlatform EventsでSalesforceの複数組織を連携させてみよう

#今年もアドベントカレンダー登録しちゃったなあ、しかもMuleSoft・・・。:disappointed_relieved:
いやあ、毎年誘われると勢いで登録しちゃうんですよねぇ・・・。:worried:
もう当日過ぎちゃったし、（当初予定通り）DFで発表したネタを使い回すしかないっ！！:stuck_out_tongue_closed_eyes:

#Salesforceの複数組織の連携とMuleSoft
DFの時はSalesforceある程度知ってる人に話す前提で資料作っちゃいましたが、ここは「Salesforce？ああ俺の愛するMuleSoftを最近買収しやがった会社か」というようなMuleSoft推しの方も訪問される前提でそもそもSalesforceとは、そして複数組織ってどういう事じゃ？という辺りから説明しようかなと。:bow_tone1:

##Salesforceとは
SalesforceはWikipediaによると下記のようなモノらしいです。
うん、分かったような分からんようなていうか肝心のMuleSoft入ってないし。:sweat_smile:
まあとりあえず世界No.1のCRMプラットフォームだと思っておいて下さい。:point_up:

>セールスフォース・ドットコムのサービスは、すべてインターネット経由で提供されるクラウドコンピューティングモデルである。そのサービスは、大きく分けて SaaS 型アプリケーションの「Sales Cloud」「Service Cloud」「Marketing Cloud」「Community Cloud」と、PaaS と呼ばれる「Force.com」「Heroku」の2つに分けられる。
>
>参考記事
>Wikepedia
>セールスフォース・ドットコム - [セールスフォース・ドットコム 製品とサービス](https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B9%E3%83%BB%E3%83%89%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0#%E8%A3%BD%E5%93%81%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)

##Salesforceの組織ってなんだ？
まあそれはそれとして、Salesforceの元々有ったプラットフォーム、上記で言うとSales CloudとかService CloudとかForce.com（確かLightning Platformに名前が変わった気がしますが）と言う辺りは、マルチテナントプラットフォームなのでちょっと特殊な構造してまして。:frowning2:

でまあ一般的なシステムで言う所の「インスタンス」に当たるようなものをSalesforceだと「組織」と言うんですね。つまり複数「組織」と言ったら一般的にはSalesforceの「インスタンス」を複数作るようなイメージになります。:bulb:

##複数組織のあれやこれ
じゃあ、とりあえずスケーラビリティ上げる為にはどんどん「組織」の数増やすんだっ！と言えるかというとそんな簡単なもんでも無くてですね、Salesforceにおいては「組織」単位で基本DBのインスタンスみたいなものも分かれてしまうので、組織を複数にすると今度はその複数の組織間でどうデータを連携させるんじゃという問題が良く起こってくる訳なんですね。（まあそれ以外にも色々有るんですが今回の本題はデータ連携なのでそこだけ取り上げます。）:sweat:

##いや待てよ、Salesforceにはデータ連携用のプラットフォームも有った気が・・・。
そこへ登場したのがMuleSoft!!（やっと本題）:fist:
満を持してSalesforceがインテグレーション製品を買収してしかもクラウド型サービスも有るというこれはもうSalesforceの為に生まれたインテグレーションサービスだとしか思えない！！（ゴマスリ、岡本さんなんか下さい。（笑））:stuck_out_tongue_winking_eye:

確か2016年にめでたくMuleSoftもこのSalesforce.comに買収されまして、Salesforceプラットフォームファミリーの一員になったんですね。

で、せっかくそんなMuleSoftなんてものが有るんだから、Salesforceの複数組織のデータ連携をMuleSoftでやってみようぜというのがこの記事の骨子になります。（ここまでが長かった。）:sweat:

#Salesforceの複数組織
じゃあ複雑になるならSalesforceで複数組織作るなんてやめようよ、1つの会社に1つの組織が良いんじゃないのかというとそうとも言えないケースも有るんですね。:frowning2:

例えば、で言うと以下のようなケースになります。
1. 企業グループの中であまりにも多種多様な業種のグループ企業が有り、ビジネス要件もプロセスも違い過ぎる
    - グループ企業Aは個人顧客向けの製造販売企業
    - グループ企業Bは個人向けの金融系企業
    - グループ企業Cは法人顧客向けの製造業
2.企業が他国でビジネスを展開しており、各国でビジネス上の慣習や状況が全く違う
    - A国では主に直接顧客に製品を販売している
    - B国では代理店を通じて顧客に製品を販売しており代理店は全て専属である
    - C国では同じく代理店を通じて顧客に製品を販売しているが、代理店は競合企業の製品も取り扱っている。

まあ上記は一例ですが、上記のようなケースだと、なんとなく「組織」つまりインスタンスを分けたほうが良さそうな気がしますね。（Salesforce知らない方にはさっぱりかもしれませんが、すみません・・・。）

# じゃあSalesforceを複数組織立ち上げたとしてどう連携させる？
色々やり方は有るんですが、単刀直入に今回ご紹介する例を言ってしまうと、Salesforceの組織AからPlatform EventsもしくはChange Data Captureを使ってデータの変更を発信し、MuleSoftで受け取って必要な変換等を行い、組織BにSOAP APIでデータを書きこむと言うやり方になります。

言葉で書いてもなんのこっちゃだと思うので、概念図で描くと以下の感じです。
<img width="935" alt="MultiOrgIntegration.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309096/695dd414-8149-dbb4-3114-903f89b220be.png">

まあ図で描いてもSalesforceかMuleSoftかどっちか良くわからんて方にはチンプンカンプンかもしれませんが、そこはご容赦をば。是非TrailHeadで学んでみて下さい。:bow_tone1:

# 分かったけど、Platform Events又はChange Data Captureって結局どっち使うの？
当然そう言う質問出ますよね。なのでそれぞれの特徴を表にしてみました。


|                  |       メリット　　　  |    デメリット          |
|:----------------:|:-----------------:|:------------------:|
| Platform Events  |イベント構造を自分で定義できる、イベント発行の条件を自分で決められる |多少の開発が必須になる|
|Change Data Capture|設定のみでイベント発行ができる|どんな小さなデータ変更に対しても必ずイベントが発行されてしまう|

じゃあ上記の特徴を踏まえると、大体のケースではPlatform Eventsの方が使い勝手が良いと思いますね。まあでもマスタテーブルとか、どんな変更でも全部連携して同期しちゃえば良いようなオブジェクトだったらChange Data Captureもオススメかもしれません。:sunny:

#まとめ
時間の都合であまり細かいとこまで踏み込んでない記事になってしまいましたが、又機会が有ればもっと細かいケースを色々ご説明出来ればと思います。ここまで読んで下さった方、ありがとうございました。:santa: