카테고리 없음

플랫폼 이벤트(Platform Event)

리보리 2024. 10. 8. 18:05

Developer문서 참고: https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_intro_emp.htm

플랫폼 이벤트(Platform Event)란?

  • 플랫폼 이벤트는 Salesforce에서 비즈니스 프로세스나 시스템 통합 작업을 처리하기 위한 커스텀 이벤트이다.
  • 플랫폼 이벤트 메시지는 Event bus에 publish되며, Event bus에 일시적으로 저장된다.
  • High-volume platform event messages는 Event bus에 72시간(3일) 동안 저장된다
  • Legacy standard-volume platform event messages는 Event bus에 24 hours (1 day)동안 저장된다
  • Pub/Sub API를 사용하여 Event bus에서 저장된 이벤트 메시지를 검색할 수 있다.
  • EX) 주문이 완료되었을 때 "주문 완료"라는 이벤트를 발행하고, 이 이벤트를 구독하는 다른 시스템이 그 정보를 실시간으로 수신하거나 후속조치를 할 수 있다.
  • https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_intro_architecture.htm

플랫폼 이벤트(Platform Event)에 대한 Log 확인

1. Publish 시 로그

  1. 이벤트를 발행한 Apex 트랜잭션은 일반적인 동기 Apex 트랜잭션에서 처리된다
  2. 일반적인 Apex코드와 같이 Developer Console통해서 확인이 가능하다.
  3. 즉 이벤트를 발행하는 코드는 다른 Apex 코드와 마찬가지로 일반적인 트랜잭션 규칙을 따르기 때문에 이 트랜잭션 내에서 발생한 모든 작업(DML)은 동기적으로 처 리되며, 트랜잭션 내의 모든 작업이 성공해야만 커밋된다

2. Platform Event Trigger 로그(구독시)

  1. Standard Object 또는 Custom Object에 대한 Trigger와 달리, 완전히 분리된 별도의 트랜잭션에서 실행된다.
  2. ⇒ 플랫폼 이벤트가 비동기로 처리되기 때문에, 이벤트를 발행한 순간과 그 이벤트에 반응하는 트리거가 실행되는 순간이 분리되어 처리됨
  3. Automated Process라는 시스템 사용자 엔터티에서 실행되므로 디버그 로그는 Developer Console을 통해서 바로 확인 할 수 없고 Automated Process 엔터티에 대한 추적 플래그를 설정하여 디버그 로그를 수집하여 확인할 수 있다
  4. 플랫폼 이벤트 Trigger 디버그 로그 설정 방법:
    1. Setup에서 Debug Logs를 검색하여 클릭
    2. New 버튼을 클릭
    3. Traced Entity Type에서 Automated Process를 선택 후 디버그 레벨 선택

Platform Event를 발행(Publish)하는 방법

  1. Flows - https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_publish_flow.htm
  2. Apex - https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_publish_apex.htm
// Order_Event__e는 사전에 정의된 플랫폼 이벤트 오브젝트임.
// 이 코드는 일반적인 동기 Apex 트랜잭션에서 실행된다
Order_Event__e orderEvent = new Order_Event__e(Order_Number__c = '105', Has_Shipped__c = true);

// EventBus.publish를 사용하여 플랫폼 이벤트를 발행
//// 이벤트가 발행되면 구독 중인 시스템이나 트리거에서 이 이벤트를 수신할 수 있다
Database.SaveResult sr = EventBus.publish(orderEvent);

// 발행 성공 여부 확인 : 이벤트 발행 결과를 SaveResult 객체로 반환함
if (sr.isSuccess()) {
    System.debug('이벤트가 성공적으로 발행되었습니다.');
} else {
    System.debug('이벤트 발행 실패: ' + sr.getErrors()[0].getMessage());
}

** 참고: 플랫폼 이벤트의 publish작업은 비동기로 발생한다.

EventBus.publish() 호출의 결과로 반환되는 Database.SaveResult즉시 발행이 성공했는지 여부가 아니라, 발행 요청이 큐에 정상적으로 추가되었는지를 알려주는 것이다.

  • 즉시 반환되는 결과:

    • EventBus.publish() 호출 후 즉시 반환되는 Database.SaveResult발행 작업이 큐에 정상적으로 추가되었는지 여부만 알려준다.
    • 즉, 이벤트가 실제로 발행된 것이 아니라, 발행이 큐에 대기 중인 상태를 의미한다.
    • 이벤트 메시지에 필수 필드가 누락되었거나 잘못된 데이터가 있으면, 즉시 오류가 발생하여 Database.SaveResult로 반환된다.
  • 발행 작업의 최종 결과:

    • 발행 작업이 큐에 추가된 후, 시스템 리소스가 사용 가능해지면, 그때 실제로 발행이 진행된다.

    • Apex Publish Callback:

      • 이벤트 발행 여부의 최종 결과는**Apex Publish Callback의 구현을 통해서 확인이 가능하다.**

        Platform Event를 구독(subscribe)하는 방법

  1. Apex Trigger

  2. Streaming API (CometD 기반)

    • Salesforce의 Streaming API를 사용하여 CometD 프로토콜을 통해 이벤트를 구독할 수 있습니다.

    • CometD 클라이언트를 사용하면 Salesforce 플랫폼 이벤트, Change Data Capture 이벤트 등을 외부 애플리케이션에서 구독할 수 있습니다.

    • JavaScript CometD 클라이언트로 이벤트 구독

        //CometD 객체를 생성
        //CometD는 Bayeux라는 메시징 프로토콜을 구현한 라이브러리로
        // Salesforce의 Streaming API를 사용하여 플랫폼 이벤트나 Change Data Capture 이벤트 등을 구독할 때 사용된다
        var cometd = new org.cometd.CometD();
        //플랫폼 이벤트 채널인 /event/Order_Completed__e에 subscribe하는 메서드
        cometd.subscribe('/event/Order_Completed__e', function(message) {//이벤트를 수신했을 때 실행되는 콜백 함수
            console.log('Order Completed Event Received:', message);
        });
      
  3. Emp API(lightning)

    • Salesforce의 Lightning Component에서 제공되는 lightning:empApi를 사용하여 이벤트를 구독할 수 있습니다.
    • Emp APICometD 프로토콜을 내부적으로 사용하며, Lightning 컴포넌트 또는 LWC(Lightning Web Component) 내에서 플랫폼 이벤트를 구독할 때 사용됩니다.
  4. Pub/Sub API (gRPC 기반)

    • Pub/Sub API는 gRPC와 HTTP/2를 기반으로 이벤트를 구독할 수 있다.
    • 주로 대량의 이벤트를 처리하거나 외부 시스템과의 통합에 많이 사용된다
    • Pub/Sub API는 이벤트를 Apache Avro 바이너리 포맷으로 전달하여 성능이 뛰어납니다.
  5. Flow

    • Flow에서도 Trigger와 마찬가지로 플랫폼 이벤트 구독 가능

❇️ 정리

  • 외부 시스템에서 이벤트를 실시간으로 구독하려면 CometDPub/Sub API
    • Streaming API(CometD)
      • 외부 시스템에서 소규모 실시간 데이터 처리가 필요할 때 Streaming API를 사용.
      • 외부 시스템에서 Salesforce의 플랫폼 이벤트Change Data Capture(CDC) 이벤트를 실시간으로 구독할때 사용
    • Pub/Sub API
      • 대규모 실시간 이벤트 처리 및 확장성이 필요할 때 Pub/Sub API를 사용.
  • Salesforce 내에서 이벤트 처리를 원한다면 Trigger 또는 Flow
  • Lightning Component에서 직접 이벤트를 구독하려면 Emp API