세일즈포스에서 비동기 처리 개요

Salesforce에서 프로세스를 실행할 때 첫 번째 물음은 동기적으로 실행할지 비동기적으로 실행할지 여부입니다. 작업을 지연시킬 수 있고 즉시 결과가 필요하지 않은 경우, Salesforce의 비동기 프로세스를 활용하는 것이 항상 기술 아키텍처에 중요한 이점을 제공합니다.

비동기 처리란 무엇인가요?

비동기 프로세스는 자체 스레드에서 실행되어 사용자를 대기시키지 않고 작업을 완료할 수 있습니다. 여기에는 주요 이점이 있습니다:

1. 사용자 경험 및 성능 향상

비동기 프로세스는 백그라운드에서 실행되므로 사용자가 완료되기를 기다릴 필요가 없습니다. 이렇게 함으로써 사용자는 작업을 계속할 수 있으면서 페이지 로드 시간과 전체 시스템 성능을 향상시킬 수 있습니다.

2. 더 높은 제한

Salesforce는 동기 트랜잭션에 엄격한 제한을 부과하며, 트랜잭션 당 쿼리나 DML 작업 수 등이 그에 해당합니다. 비동기 처리는 추가 실행 제한을 제공하여 작업을 확장할 공간을 더 많이 제공합니다.

3. 확장성

비동기 처리를 통해 복잡하거나 자원 집약적인 작업을 백그라운드에서 실행함으로써 시스템 성능을 저해하지 않고 효율적으로 확장할 수 있습니다.

여기 비동기 처리를 위해 Salesforce가 제공하는 다양한 도구들이 있습니다.

주요 고려 사항

지금까지 우리는 비동기 처리, 그 이점, 그리고 Salesforce가 이러한 작업을 위해 제공하는 다양한 도구들을 탐구했습니다. 그러나 비즈니스 요구 사항에 맞게 비동기 처리를 선택하기 전에 고려해야 할 중요한 요소들이 몇 가지 있습니다.

1. 비동기 처리에는 SLA가 없음

비동기 프로세스는 보장된 서비스 수준 협약 (SLA)이 없다는 것을 염두에 두세요. 리소스가 사용 가능한 경우에 자체 스레드에서 실행되며, 따라서 작업이 특정 시간 프레임 내에 완료될 것이라는 보장이 없습니다. 그러므로 시간이 중요한 비즈니스 흐름에 대해 비동기 처리를 사용하지 않는 것이 중요합니다.

2. 작업에 적합한 적절한 도구 선택

이전에 언급했듯이 Salesforce는 비동기 처리를 위해 다양한 도구를 제공하며, 각각이 다른 사용 사례를 위해 설계되었습니다. 각 도구의 강점과 한계를 이해하면 특정 요구 사항에 가장 적합한 도구를 선택하는 데 도움이 됩니다.

3. 코드를 일괄 처리하십시오

Salesforce는 비동기 프로세스에 대해 더 높은 실행 제한을 제공하지만, 여전히 작업을 일괄 처리하는 것이 중요합니다. 이렇게 하면 코드가 여러 레코드를 효율적으로 처리할 수 있으며, 플랫폼 제한 내에 머무르고 성능을 유지할 수 있습니다.

오류 처리 및 모니터링 구현

비동기 작업이 백그라운드에서 실행되므로 견고한 오류 처리 및 모니터링이 중요합니다. try-catch 블록을 사용하고 오류를 사용자 정의 객체에 기록하여 추적을 용이하게 합니다. 또한 API 호출 문제와 같은 일시적인 실패를 관리하기 위해 재시도 논리를 구현하여 프로세스의 신뢰성을 보장하세요.

비동기 도구 심층 분석

Salesforce의 각 비동기 도구를 자세히 살펴보겠습니다.

Future 메서드

Future 메서드는 독립적으로 자체 스레드에서 실행할 수 있는 작업에 사용됩니다. 사용 사례 중 하나는 사용자가 작업이 완료될 때까지 기다릴 필요가 없는 외부 웹 서비스 호출 실행입니다.

Future 메서드를 정의하려면 메서드에 @future 어노테이션을 단순히 추가하면 됩니다.

Java

 

public class FutureClass {
@future
 public static void myFutureMethod(list recordIds){
   //긴 실행 작업 코드
 }  
}

Future 메서드에 대한 주요 포인트:

  • 정적. Future 메서드는 정적이어야 합니다.
  • Void 반환 유형. void만 반환할 수 있습니다.
  • 기본 데이터 유형. Future 메서드는 기본 데이터 유형(String, Integer, Id 등)만 허용합니다. 매개변수로 복합 객체를 사용할 수 없습니다.
  • 호출. Future 메서드가 웹 서비스 호출을 수행해야 하는 경우, 호출을 수행할 수 있도록 어노테이션에 callout=true 속성을 포함해야 합니다.
Java

 

public class FutureClass {
@future(callout = true)
 public static void myFutureMethod(){
   //여기에 호출
 }  
}

Queueable Apex

미래 메서드와 유사하게 Queueable Apex를 사용하면 작업을 자체 스레드에서 실행할 수 있어서 장기 실행 작업에 이상적입니다. 이는 Apex 작업 대기열을 활용하며, 미래 메서드에 비해 비동기 처리에 더 유연하고 강력한 접근 방식을 제공합니다.

Queueable Apex를 구현하려면 클래스가 Queueable 인터페이스를 구현해야 합니다. 클래스는 항상 비동기 작업을 위한 논리를 포함하는 execute 메서드를 정의해야 합니다.

Java

 

public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
  //장기 실행 작업
}
}

System.enqueueJob()을 호출하여 Queueable Apex를 실행할 수 있으며, 이는 작업을 대기열에 추가하고 작업 ID를 반환합니다. 이 작업 ID를 사용하여 AsyncApexJob 개체를 쿼리하여 작업 상태를 모니터링할 수 있습니다.

Java

 

ID jobID = System.enqueueJob(new QueueableClass());

Queueable Apex에 대한 주요 포인트:

  • 원시 데이터 유형이 아닌 데이터 유형. 미래 메서드와 달리 Queueable 클래스의 멤버 변수로 원시 데이터 유형이 아닌 데이터 유형을 사용할 수 있습니다.
  • 작업 체이닝. Queueable 작업은 체이닝될 수 있어서 이미 실행 중인 작업에서 두 번째 작업을 시작하여 비동기 작업의 시퀀스를 만들 수 있습니다.

Batch Apex

대량의 레코드에서 비동기 작업을 실행해야 하는 경우, Batch Apex가 이상적인 솔루션입니다. 대규모 데이터 집합을 작은 관리 가능한 청크로 나누어 처리합니다.

Batch Apex를 구현하려면 클래스가 Database.Batchable 인터페이스를 구현해야 합니다. Batch Apex 클래스는 start, execute, finish 세 가지 메서드를 정의해야 합니다.

1. 시작 메서드

이 메서드는 배치 작업의 시작 부분에서 실행됩니다. 대량 데이터 세트를 수집하기 위한 SOQL 쿼리를 포함하고 QueryLocator를 반환해야 합니다. Batch Apex를 사용할 때 start 메서드에서 SOQL 쿼리로 검색된 총 레코드 수에 대한 제한이 우회됩니다.

Java

 

public Database.QueryLocator start(Database.BatchableContext bc) {}

2. 실행 메서드

execute 메서드는 각각의 레코드 배치에 대해 호출됩니다. 레코드가 처리되는 순서는 보장되지 않습니다.

Java

 

public void execute(Database.BatchableContext bc, list<Object>){}

3. 완료 메서드

finish 메서드는 모든 레코드 배치가 처리된 후에 호출됩니다. 주로 알림 이메일을 보내는 등 후속 처리 작업에 사용됩니다. 배치 작업의 각 실행은 단일 트랜잭션으로 간주되며 각 배치에 대해 관리자 제한이 재설정됩니다.

배치 작업을 트리거하려면 Database.executeBatch 메서드를 사용하십시오. 이렇게 하면 배치 작업이 비동기 대기열에 추가됩니다.

Database.executeBatch 메서드는 두 개의 매개변수를 사용합니다:

  1. Batch Apex 클래스의 인스턴스.
  2. 레코드당 배치 수를 지정하는 선택적 배치 크기 매개변수. 지정할 수 있는 최대 배치 크기는 2000입니다.
Java

 

ID batchprocessid = Database.executeBatch(new BatchApex(),2000);

비동기 Apex 사용 시의 모범 사례

고성능 프로세스에서 미래 또는 대기열 메서드 트리거 피하기

데일리 비동기 한도를 고갈시킬 수 있는 Apex 트리거와 같은 프로세스에서 미래 또는 대기열 메서드를 트리거할 때 조심해야 합니다. 이러한 프로세스는 빠르게 이용 가능한 비동기 자원을 소비할 수 있습니다.

성능 최적화

미래 또는 대기열 메서드의 성능이 최적화되었는지 확인하세요. 이에는 다음이 포함됩니다:

  • 처리 시간을 줄이기 위한 쿼리 최적화.
  • 웹 서비스 콜아웃 지속 시간 최소화.
  • 병목 현상을 방지하기 위해 트리거 또는 플로우와 같은 관련 로직을 최적화.

대량 데이터 양에 대한 배치 Apex 사용

다량의 레코드를 처리할 때는 항상 미래 또는 대기열 메서드보다 배치 Apex를 선호하세요. 배치 Apex는 대량 데이터 세트를 효율적으로 처리할 수 있도록 설계되었으며, 미래 및 대기열 메서드는 더 작은 작업에 더 적합합니다.

대기열 Apex는 더 큰 유연성 제공

대기열 Apex는 미래 메서드와 비교하여 작업 실행에 대한 더 많은 제어를 제공하며, 작업을 연결하거나 더 큰 데이터 양을 효율적으로 처리할 수 있는 기능을 갖추고 있습니다.

결론

결론적으로, Salesforce의 비동기 Apex는 장기간 실행되고 자원을 많이 소비하는 프로세스를 처리하는 강력한 도구이며 시스템 성능과 사용자 경험을 유지하는 데 도움이 됩니다. Future Methods, Queueable Apex, Batch Apex와 같은 다양한 비동기 메소드를 이해하고, 모범 사례를 따르면 효율적이고 확장 가능한 솔루션을 설계하여 코드와 시스템 자원을 최적화할 수 있습니다. 비동기 작업이 원활하고 안정적으로 실행되도록 하려면 가버너 제한, 성능 최적화 및 오류 처리와 같은 요소를 고려해야 합니다.

Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview