규칙 엔진과 상호 작용하는 선호하는 방법
-
19-09-2019 - |
문제
규칙 지향적 프로젝트 (.NET -IBM에 ILOGS 규칙 사용)로 뛰어 들려고합니다. 그리고 규칙 처리를 설정하는 방법과 규칙 엔진과 상호 작용하는 방법에 대한 몇 가지 다른 관점을 읽었습니다.
내가 본 두 가지 주요 생각은 규칙 엔진 (자체 서버 농장)을 중앙 집중화하고 웹 서비스 API (또는 WCF를 통한 ILOG의 경우)를 통해 농장에 대한 프로그램을하는 것입니다. 다른 쪽은 각 앱 서버에서 규칙 엔진 인스턴스를 실행하고 자체 규칙 사본을 갖는 각 인스턴스와 로컬로 상호 작용하는 것입니다.
중앙 집중화의 중앙 집중화는 규칙을 중앙 집중식 위치로 쉽게 배치하는 것입니다. 애플리케이션 서버 구성을 확장 할 때마다 스케일링하기보다는 규칙 규모가 규모입니다. 이것은 구매 한 라이센스 관점에서 폐기물을 줄입니다. 이 설정의 아래쪽은 서비스 호출, 네트워크 대기 시간 등의 추가 오버 헤드입니다.
규칙 엔진을 로컬로 작동하는 상향/단점은 중앙 집중식 구성의 상승/하부와 정반대입니다. 느린 서비스 호출 (빠른 API 호출), 네트워크 문제 없음, 각 앱 서버는 자체적으로 의존합니다. 규칙 배포 관리가 더욱 복잡해집니다. 앱 클라우드에 노드를 추가 할 때마다 룰 엔진에 대한 더 많은 라이센스가 필요합니다.
백서를 읽을 때 Amazon이 앱 서버 구성 별 규칙 엔진을 실행하고 있음을 알 수 있습니다. 그들은 규칙을 느리게 배치하는 것으로 보이며 비즈니스 논리가 주어진 기간 동안 동기화되지 않더라도 규칙 게시의 지연이 "허용 가능"임을 인식합니다.
의문: 경험을 통해 규칙을 중심으로 일하는 데 많은 시간을 소비하지 않은 상점을 위해 규칙을 .NET 기반 웹 앱에 통합하는 가장 좋은 방법은 무엇입니까?
해결책
우리는 DotNet 용 Ilog를 사용하고 있습니다 배포 된 파일럿 프로젝트가 있습니다.
미성숙 규칙 아키텍처에 대한 요약은 다음과 같습니다.
- 규칙 이외의 모든 데이터 액세스.
- 규칙은 코드 (소스 제어, 릴리스 프로세스, Yada Yada)와 동일한 방식으로 배포됩니다.
- 규칙을 사용하는 프로젝트 (서비스)는
ILOG.Rules.dll
사용자 정의 풀링 클래스를 통한 새로운 규칙자. 규칙 세트를 규칙 세트에 바인딩하는 데 비싸기 때문에 규칙자는 풀링됩니다. - 거의 모든 규칙은 규칙 흐름 매개 변수보다는 Assert'd 객체를 기대하도록 작성됩니다.
- 규칙은 동일한 메모리 공간에서 실행되므로 규칙에 의해 수정 된 인스턴스는 동일한 인스턴스 프로그램에서 - 국가의 즉각적인 전파입니다.
- 거의 모든 규칙은 RuleFlow를 통해 실행됩니다 (RuleFlow의 단일 규칙이더라도).
우리는 규칙 소스의 호스트가되기 위해 ruleteamserverforsharepoint뿐만 아니라 호스팅 플랫폼으로 inribeexecutionserver를보고 있습니다. 결국, 우리는 코드 릴리스 프로세스 이외의 생산에 규칙을 배치 할 것입니다.
우리의 모든 규칙 노력의 주요 장애물은 모델링 및 규칙 제작 기술입니다.
다른 팁
나는 중앙 집중식 논쟁을 좋아하지 않았다. 이는 모든 것이 규칙 엔진에 결합되어 시스템의 모든 규칙에 대한 덤핑 접지가된다는 것을 의미합니다. 곧 당신은 미지의 것에 대한 두려움 때문에 아무것도 바꿀 수 없습니다 : "우리는 무엇을 깨뜨릴 것인가?"
나는 Amazon의 서비스에 대한 아이디어를 고립되고 자율적 인 구성 요소로 선호합니다. 나는 서비스가 그들의 데이터를 소유한다는 것을 의미한다고 해석합니다. 그리고 그들의 규칙.
이것은 규칙 공간을 분할 할 수있는 이점이 추가되었습니다. 규칙 세트는 성장함에 따라 유지하기가 더 어려워집니다. 관리 가능한 크기로 유지하는 것이 좋습니다.
규칙 세트의 일부가 공유되면 서비스가 자체 규칙 엔진 인스턴스를 갖고 시작시 데이터베이스에서 공통 규칙을로드 할 수있는 데이터 중심의 DI 접근 방식을 선호합니다. ILOG 라이센스로 인해 여러 인스턴스 비용이 엄청난 비용을 지불하는 경우에는 실현할 수 없습니다. 도움이되는 제품이 실제로 슬픔을 가져다 줄 건축 적 선택을 지시하는 경우가 될 것입니다. 저렴한 대안 (예 : Java-Land의 Jboss 규칙)에 대한 좋은 주장이 될 것입니다.
데이터 중심 의사 결정 트리 접근 방식은 어떻습니까? RETE Rules Engine이 정말로 필요한가?
규칙 엔진을 설정하려고 노력하여 가능한 한 다른 기업에서 분리되었습니다. 가능하다면 데이터베이스 나 서비스에 전화하지 않을 것입니다. 결정을 요구하는 물건의 책임을 더 잘하는 것이 좋습니다. 필요한 웹 서비스 및 데이터베이스를 호출하여 필요한 데이터를 조립하고 규칙 엔진으로 전달한 다음 작업을 수행하도록하십시오. 커플 링은 적입니다 : 시스템을 최소화하기 위해 시스템을 설계하십시오. 규칙 엔진을 분리하는 것은 좋은 방법입니다.
"어떤 서버"질문에 대해서는 할 말이 많지 않지만 의사 결정 서비스를 개발할 것을 촉구합니다 - 결정을 내리기 위해 규칙을 사용하지만 비즈니스 상태를 바꾸지 않는 호출 가능한 서비스. 통화 응용 프로그램/서비스/프로세스가 의사 결정 서비스를 호출 한 결과로 결정할 데이터가 변경되고 통화 구성 요소가 실제로 의사 결정 서비스가 제안한 조치를 시작하도록하는 데이터 변경을 결정하게하면 의사 결정 서비스를 계속해서 더 쉽게 사용할 수 있습니다. 다시 (채널, 프로세스 등). 더 깨끗하고 나머지 인프라와 관련이 있고 의사 결정 서비스가 더 재사용 가능하고 관리 가능할 것입니다. 토론 여기 eBizq에서 이와 관련하여 읽을 가치가있을 수 있습니다.
규칙 엔진에 대한 경험에서 우리는 규칙 엔진과의 상호 작용을 관리하기 위해 매우 기본적인 관행 세트를 적용했습니다. 우선, 이들은 항상 상용 규칙 엔진 (ILOG, CORTICON)이었으며 오픈 소스 (Drools)가 아니 었으므로 각 앱 서버에 로컬로 배포하는 것은 라이센스 비용으로 인해 실제로 실행 가능한 옵션이 아닙니다. 따라서 우리는 두 가지 주요 풍미에도 불구하고 항상 중앙 집중식 모델을 사용했습니다.
- 웹 서비스의 원격 실행 - 귀하의 질문에 명시한 것과 같은 방식으로, 당사는 규칙 엔진 제품에서 제공하는 SOAP 기반 서비스를 호출합니다. 웹 서비스 영역 내에서 우리는 몇 가지 옵션을 제공했습니다. (1) 요청을 "BoxCar"로, 응용 프로그램이 규칙 처리 요청을 대기하고 일회성 메시지와 달리 청크로 보낼 수 있습니다. (2) 공급 업체가 제공 한 스레딩 및 프로세스 옵션을 조정합니다. 여기에는 기능별로 의사 결정 서비스를 분리하고 W3WP를 각각 할당하거나 웹 가든을 사용하는 것이 포함됩니다. 박스 카, 스레드 및 프로세스로 할 수있는 많은 조정이 있으며 올바른 믹스를 얻는 것은 정확한 과학보다 시행 착오 (규칙 세트와 데이터를 아는 것)의 과정입니다.
- 프로세스에서 규칙 엔진을 원격으로 호출하십시오 - 직렬화 및 탈사의 오버 헤드를 피하기위한 고전적인 배치 스타일 트릭. 원격으로 규칙 엔진에 대한 과정 내 호출을 발사하는 전화를받습니다. 이것은 예약 (예 : 배치) 또는 수요 (예 : 요청의 "Boxcars")를 기준으로 수행 할 수 있습니다. 어느 쪽이든, 프로세스 및 데이터베이스와 직접 상호 작용함으로써 서비스 호출의 많은 오버 헤드를 피할 수 있습니다. 이 프로세스의 단점은 IIS 또는 EJB/Servlet 컨테이너가없고 스레드를 관리하고 직접 수행해야한다는 것입니다.