' P '

whatever I will forget

Salesforce プラットフォームイベントの公開

イベント駆動型システムのコンポーネント

コンポーネント 説明
イベント ビジネスプロセスにおいて意味のある状態の変化。たとえば、発注は意味のあるイベントです。注文履行センターは、注文を処理する前に通知を受け取ることを想定しているからです。
イベントメッセージ イベントに関するデータが含まれるメッセージ。イベント通知とも呼ばれます。たとえば、イベントメッセージとして、注文の情報が含まれる、発注に関する通知などがあります。
イベントプロデューサ イベントメッセージの公開者。たとえば、発注アプリケーションなどがあります。
イベントチャネル イベントのストリームで、そのストリーム上でイベントプロデューサはイベントメッセージを送信し、イベントコンシューマーはそのメッセージを読み込みます。プラットフォームイベントの場合、チャネルは 1 つのプラットフォームイベント用で、そのプラットフォームイベントのすべてのイベントメッセージがグループ化されます。
イベントコンシューマー チャネルの登録者で、そのチャネルからメッセージを受信します。たとえば、新規注文の通知を受信する注文履行アプリケーションなどがあります。
イベントバス 公開-登録モデルに基づいたマルチテナントでマルチクラウドのイベントストレージおよび配信サービス。イベントバスを使用することで、保持期間内であればいつでも保存されたイベントメッセージを取得できます。時系列イベントログに基づいたイベントバス。イベントメッセージが Salesforce で受信された順序で保存されて配信されるようにします。

アーキテクチャ

f:id:mankozooyork:20220317144253p:plain

プラットフォームイベントの定義および公開

  • 設定 → プラットフォームイベント で定義する

公開動作について

  • [コミット後に公開] 公開動作を定義したプラットフォームイベントはトランザクションに左右され、ロールバックできる
  • [すぐに公開] 公開動作を定義したプラットフォームイベントはトランザクションに左右されず、ロールバックできない
    • 下記の場合、こちらを選択する:
      • トランザクションが成功したかどうかに関係なくイベントメッセージが公開されるようにする場合
      • 公開者と登録者が独立していて、公開者がコミットするデータに登録者が依存していない場合

API 参照名サフィックス

  • システムにより __e サフィックスが付加されてイベントの API 参照名が作成される

イベント保持と ReplayId システム項目

  • Salesforce では、大規模プラットフォームイベントが 72 時間保存される
  • 保存されたイベントは API CometD クライアントを使用してイベントバスから取得可能
  • Apex トリガでは、サスペンド状態のトリガを再開し、保持された最も古い未処理イベントを取得可能
  • Salesforce はイベントメッセージを一時的に保持していますが、SOQL や SOSL を使用したクエリはできない
  • 過去のイベントを取得するには、CometD で登録するか、ReplayId オプションを使用する必要

Apex を使用したイベントメッセージの公開

  • イベントメッセージを公開するには、イベントのインスタンスを作成して EventBus.publish() メソッドに渡す
// List to hold event objects to be published.
List<Cloud_News__e> newsEventList = new List<Cloud_News__e>();
// Create event objects.
Cloud_News__e newsEvent1 = new Cloud_News__e(
           Location__c='Mountain City',
           Urgent__c=true,
           News_Content__c='Lake Road is closed due to mudslides.');
Cloud_News__e newsEvent2 = new Cloud_News__e(
           Location__c='Mountain City',
           Urgent__c=false,
           News_Content__c='Small incident on Goat Lane causing traffic.');
// Add event objects to the list.
newsEventList.add(newsEvent1);
newsEventList.add(newsEvent2);
// Call method to publish events.
List<Database.SaveResult> results = EventBus.publish(newsEventList);
// Inspect publishing result for each event
for (Database.SaveResult sr : results) {
    if (sr.isSuccess()) {
        System.debug('Successfully published event.');
    } else {
        for(Database.Error err : sr.getErrors()) {
            System.debug('Error returned: ' +
                        err.getStatusCode() +
                        ' - ' +
                        err.getMessage());
        }
    }
}

Salesforce API を使用したイベントメッセージの公開

  • URI: /services/data/v45.0/sobjects/yourEventName/
  • POST
  • Request Body:
{
   "Location__c" : "Mountain City",
   "Urgent__c" : true,
   "News_Content__c" : "Lake Road is closed due to mudslides."
}