다음을 통해 공유


BRE(비즈니스 규칙 엔진) 성능 최적화

BizTalk Server 솔루션에서 BRE(비즈니스 규칙 엔진)를 구현할 때 다음 요소를 고려해야 합니다.

팩트 유형

규칙 엔진은 XML 및 데이터베이스 팩트 액세스에 걸리는 시간에 비해 .NET 팩트 액세스 시간이 적습니다. 정책에서 .NET 또는 XML 또는 데이터베이스 팩트를 사용할 수 있는 경우 성능 향상을 위해 .NET 팩트를 사용하는 것이 좋습니다.

데이터 테이블과 데이터 연결 비교

데이터 집합의 크기가 작으면(< 10개 정도) TypedDataTable 바인딩은 DataConnection 바인딩보다 더 나은 성능을 제공합니다. 그러나 데이터 집합이 큰 경우 DataConnection 바인딩이 TypedDataTable 바인딩보다 더 잘 수행됩니다(대략 10개 행보다 크거나 같음). 따라서 데이터 집합의 예상 크기에 따라 DataConnection 바인딩 또는 TypedDataTable 바인딩을 사용할지 여부를 결정해야 합니다.

팩트 리트리버

팩트 검색기는 일반적으로 정책을 실행하기 전에 규칙 엔진에 장기적이고 느리게 변화하는 팩트를 제공하는 데 사용되는 표준 메서드를 구현합니다. 엔진은 이러한 팩트를 캐시하고 다중 실행 주기에서 사용합니다. 규칙 엔진을 호출할 때마다 정적 또는 상당히 정적인 사실을 제출하는 대신 처음으로 팩트 검색기를 만든 다음 필요한 경우에만 메모리에서 팩트 업데이트를 수행해야 합니다.

규칙 우선 순위

규칙에 대한 우선 순위 설정은 0의 양쪽에 범위가 지정되며 우선 순위가 더 높은 숫자가 될 수 있습니다. 작업은 가장 높은 우선 순위에서 가장 낮은 우선 순위까지 순서대로 실행됩니다. 정책이 Assert/Update 호출을 사용하여 정방향 체인 동작을 구현하는 경우 우선 순위 설정을 사용하여 체인을 최적화할 수 있습니다. 예를 들어 Rule2Rule1에서 설정한 값에 종속되어 있다고 가정합니다. Rule1의 우선 순위를 높이면 Rule1이 실행되고 값이 업데이트된 후에만 Rule2가 실행됩니다. 반대로 Rule2 에 더 높은 우선 순위가 지정되면 한 번 실행한 다음 Rule1 이 실행된 후 다시 실행되고 Rule2 가 조건을 사용하고 있다는 사실을 업데이트할 수 있습니다. 이는 올바른 결과를 제공할 수 있지만 이 시나리오에서 Rule1 에 더 높은 우선 순위를 부여하면 성능이 향상됩니다.

호출 업데이트

Update 함수를 사용하면 업데이트된 팩트를 사용하는 모든 규칙이 다시 평가됩니다. 업데이트 함수 호출은 팩트를 업데이트할 때 큰 규칙 집합이 다시 평가되는 경우에 특히 비용이 많이 들 수 있습니다. 이 동작을 피할 수 있는 상황이 있습니다. 예를 들어 다음 규칙을 고려합니다.

Rule1:

IF PurchaseOrder.Amount > 5   
THEN StatusObj.Flag = true; Update(StatusObj)  

Rule2:

IF PurchaseOrder.Amount <= 5   
THEN StatusObj.Flag = false; Update(StatusObj)  

정책의 나머지 모든 규칙은 해당 조건에서 StatusObj.Flag 를 사용합니다. 따라서 StatusObj 개체에서 Update가 호출되면 모든 규칙이 다시 평가됩니다. 금액 필드의 값이 무엇이든 Rule1 또는 Rule2를 제외한 모든 규칙은 업데이트 호출 전에 한 번, 업데이트 호출 후에 한 번 평가됩니다.

연결된 오버헤드를 완화하기 위해 정책을 호출하기 전에 플래그 필드의 값을 false 로 설정한 다음 정책에서 Rule1 만 사용하여 플래그를 설정할 수 있습니다. 이 경우 Amount 필드의 값이 5보다 크고 Amount 값이 5보다 작거나 같은 경우 Update함수가 호출되지 않는 경우에만 Update가 호출됩니다. 따라서 Rule1 또는 Rule2 를 제외한 모든 규칙은 Amount 필드 값이 5보다 큰 경우에만 두 번 평가됩니다.

논리 OR 연산자 사용

조건에서 논리적 OR 연산자 수가 늘어나면 규칙 엔진의 분석 네트워크를 확장하는 추가 순열이 생성됩니다. 성능 면에서는 조건을 논리적 OR 연산자를 포함하지 않는 원자성 규칙으로 나누는 것이 좋습니다.

캐싱 설정

규칙 엔진은 두 개의 캐시를 사용합니다. 첫 번째 는 업데이트 서비스에서 사용되고 두 번째는 각 BizTalk 프로세스에서 사용됩니다. 정책을 처음 사용할 때 BizTalk 프로세스는 업데이트 서비스에서 정책 정보를 요청합니다. 업데이트 서비스는 규칙 엔진 데이터베이스에서 정책 정보를 검색하고, 캐시하고, BizTalk 프로세스에 정보를 반환합니다. BizTalk 프로세스는 해당 정보를 기반으로 정책 개체를 만들고 연결된 규칙 엔진 instance 정책 실행을 완료할 때 정책 개체를 캐시에 저장합니다. 동일한 정책이 다시 호출되면 BizTalk 프로세스는 사용할 수 있는 경우 캐시에서 정책 개체를 다시 사용합니다. 마찬가지로 BizTalk 프로세스가 업데이트 서비스에서 정책에 대한 정보를 요청하는 경우 업데이트 서비스는 사용 가능한 경우 해당 캐시의 정책 정보를 찾습니다. 또한 업데이트 서비스는 60초마다 데이터베이스에 정책에 대한 업데이트가 있는지 확인합니다. 업데이트가 있는 경우 업데이트 서비스는 정보를 검색하고 업데이트된 정보를 캐시합니다.

이러한 캐시와 관련된 규칙 엔진에는 CacheEntries, CacheTimeoutPollingInterval의 세 가지 튜닝 매개 변수가 있습니다. 이들 매개 변수의 값은 레지스트리나 구성 파일에 지정할 수 있습니다. CacheEntries 매개 변수의 값은 캐시의 최대 항목 수이며 기본적으로 32 값으로 설정됩니다. 특정 시나리오에서 성능을 향상시키기 위해 CacheEntries 매개 변수의 값을 늘릴 수 있습니다. 예를 들어 40개 정책을 반복적으로 사용한다고 가정합니다. 성능을 향상시키기 위해 CacheEntries 매개 변수의 값을 40으로 늘릴 수 있습니다. 이렇게 하면 업데이트 서비스에서 최대 40개 정책의 캐시 세부 정보를 메모리에 유지할 수 있습니다.

CacheTimeout 값은 업데이트 서비스 캐시에서 항목이 유지되는 시간(초)입니다. 즉, CacheTimeout 값은 정책에 대한 캐시 항목이 참조되지 않고 캐시에서 유지 관리되는 기간을 나타냅니다. CacheTimeout 매개 변수의 기본값은 3600초 또는 1시간입니다. 즉, 캐시 항목이 1시간 이내에 참조되지 않으면 항목이 삭제됩니다. 경우에 따라 성능을 향상시키기 위해 CacheTimeout 매개 변수의 값을 늘리는 것이 도움이 될 수 있습니다. 예를 들어 정책이 2시간마다 호출되는 경우 CacheTimeout 매개 변수를 2시간보다 큰 값으로 늘려 정책 실행 성능이 향상됩니다.

규칙 엔진의 PollingInterval 매개 변수는 업데이트 서비스가 업데이트할 규칙 엔진 데이터베이스를 검사 시간(초)을 정의합니다. PollingInterval 매개 변수의 기본값은 60초입니다. 정책이 전혀 업데이트되지 않거나 거의 업데이트되지 않는 경우 이 매개 변수를 더 높은 값으로 변경하여 성능을 향상시킬 수 있습니다.

SideEffects 속성

ClassMemberBinding, DatabaseColumnBindingXmlDocumentFieldBinding 클래스에는 SideEffects라는 속성이 있습니다. 이 속성은 바인딩된 필드, 멤버 또는 열의 값을 캐시할지 여부를 결정합니다. DatabaseColumnBindingXmlDocumentFieldBinding 클래스의 SideEffects 속성의 기본값은 false입니다. ClassMemberBinding 클래스의 SideEffects 속성의 기본값은 true입니다. 따라서 정책 내에서 XML 문서의 필드나 데이터베이스 테이블의 열에 두 번 이상 액세스할 경우 해당 값을 캐시에서 검색합니다. 그러나 .NET 개체의 멤버에 두 번 이상 액세스할 때는 캐시가 아니라 .NET 개체에서 값을 검색합니다. .NET ClassMemberBindingSideEffects 속성을 false로 설정하면 필드 값이 캐시에서 두 번째로 검색되기 때문에 성능이 향상됩니다. 이러한 처리는 프로그래밍 방식으로만 가능합니다. 비즈니스 규칙 작성기 도구는 SideEffects 속성을 노출하지 않습니다.

인스턴스 및 선택성

XmlDocumentBinding, ClassBindingDatabaseBinding 클래스에는 인스턴스 및 선택성이라는 두 가지 속성이 있습니다. Instances 값은 작업 메모리의 예상 인스턴스 수입니다. Selectivity 값은 규칙 조건을 성공적으로 통과하는 클래스 인스턴스의 백분율입니다. 규칙 엔진은 첫 번째 조건 평가에서 최소한의 인스턴스만 사용한 다음 나머지 인스턴스를 사용하도록 조건 평가를 최적화하기 위해 이 두 값을 사용합니다. 개체의 인스턴스 수에 대한 사전 지식이 있는 경우 Instances 속성을 해당 값으로 설정하면 성능이 향상됩니다. 마찬가지로 조건을 전달하는 이러한 개체의 백분율에 대한 사전 지식이 있는 경우 Selectivity 속성을 해당 값으로 설정하면 성능이 향상됩니다. 이 두 매개 변수 값은 프로그래밍 방식으로만 설정할 수 있습니다. 비즈니스 규칙 작성기 도구에는 이 두 속성이 표시되지 않습니다.

참고 항목

BizTalk Server 성능 최적화