Streaming API
特徴
- **Publish/Subscribe(公開/登録)**モデル
- PushTopic、汎用ストリーミング、プラットフォームイベント、変更データキャプチャに分類される 参考ページ
PushTopic
- 設計パターンの「データの変更に基づくUIの更新」に該当する
- Salesforceとクライアント間の接続をポーリングする為にBayeuxプロトコルを実装したCometDを利用する
- Publish側は公開用チャネルのPushTopicオブジェクトにレコードを作成する
- Publish/Subscribe間でロングポーリングを行う事でセッション維持と通知の確認を行っている
- クライアントは外部クライアントまたはSalesforce内のページ
- 外部クライアントはCometDのライブラリを利用して実装する必要がある
- Salesforce内のページはVisualforceまたはLWC
- ロングポーリングの通知結果でSubscribe側がPublishであるSalesforce側からデータを取得する場合、ストリーミングAPIイベント数がカウントされる(ポーリング時はカウント対象外)
- 通知内容は1日キューイングされる
- 再送や通知を保証しない(UDPみたい)
- 外部クライアントが通知内容を再取得したい場合はCometD経由でReplayIdを指定する事で再取得可能
汎用ストリーミング
- Salesforce内のデータ変更に関連しない通知を行いたい場合に利用する
プラットフォームイベント
- 「リモートプロセスの呼び出しーファイアアンドフォーゲット」に該当する設計パターン
-
Salesforce内外(内部だけではなく外部からも通知可能!)からイベント通知を行う仕組み
こちらのページの図が非常に分かり易い - Salesforce内としてはプロセスビルダーやフローからも通知可能
コード(PushTopic)
PushTopic topic = new PushTopic();
topic.Name = 'Architecuter News';
topic.NotifyForOperationCreate = true;
topic.NotifyForOperationUpdate = true;
topic.NotifyForOperationDelete = true;
topic.Query = 'SELECT Name From Lead Where Company= \'Salesforce\'';
topic.NotifyForFields = 'All';
insert topic;
通知されるまでの流れ
以下の3条件が全て満たされる場合に通知される
- レコードが更新 かつ
- NotifyForFiledsを満たす場合 かつ
- QueryのWhere句の条件が一致する場合
Query項目
- チャネルへの送信をトリガするレコードへの変更を特定するSOQLクエリステートメント
- リレーション名などでの項目はサポート外
NotifyForFields項目
選択値 | 説明 | 備考 |
---|---|---|
All | レコードのいずれかの項目が更新された場合 | NameまたはCompany |
Referenced | Select句、Where句で使用されている項目のどれかが更新されたら場合 | NameまたはCompany |
Select | Select句で使用されている項目のどれかが更新されたら場合 | Name |
Where | Where句で使用されている項目のどれかが更新されたら場合 | Company |
Streaming APIを選択するシナリオ
- 準リアルタイムで他システムにSalesforceデータの変更を教えたい場合
- ただし確実に通知させるほどではない場合(スマホのYoutubeチャンネルの新規投稿通知みないな感じ)