2013-01-09 4 views
6

분석 할 메시지가 연속적으로 있습니다. 이 분석은 작성자, 주제, 정서, 단어 수 및 일련의 고유 한 단어와 같은 다양한 변수를 반환합니다. 시스템의 사용자는 규칙을 정의 할 수 있습니다. 규칙이 일치하면 경고를 트리거해야합니다. 규칙은 SQL 데이터베이스에 저장해야합니다. 규칙은 메시지 분석의 단일 기준 (예 : word-count > 15 && topic = 'StackOverflow' && sentiment > 2.0 && word-set contains 'great')을 결합한 것입니다. 각 허용 된 규칙 기준은 메시지 분석이 끝날 때 제공되며, 그 후에 규칙 유효성 검사가 트리거되고 Java에서 구현됩니다.연속 규칙 일치 패턴

시스템의 모든 사용자가 정의한 모든 규칙에 대해 모든 메시지를 확인해야합니다.이 규칙은 많은 계산 능력 (초당 10 개 이상의 메시지가 있으며 확인하려면 10.000 이상의 규칙이 있습니다)이 필요합니다. 일치하는 프로세스의 속도를 높일 수있는 공통 패턴이 있습니까? 하나씩 제외하고 규칙을 병렬로 검사 할 수 있습니까? 순수한 SQL에서이 작업을 수행 할 수 있습니까? 다른 유형의 규칙에 대한 스키마는 어떻게 생겼습니까?

+0

SQL은 일반적으로 관계형 데이터베이스 용입니다. 이 시스템의 관계형 데이터베이스는 어디에 있습니까? –

+0

사용자가 정의한 저장 규칙은 어디에 있습니까? – sourcecode

+0

각 메시지에는 규칙 전체 또는 일부를 해결하는 데 필요한 모든 필드가 포함되어 있습니까? –

답변

2

귀하의 고려 사항은 단순히 일치 처리량 이상의 것일 수 있습니다. 예를 들어, 규칙을 유지해야합니다.

하지만 모든 규칙을 충족시키는 데 필요한 모든 입력란을 포함하는 정적 규칙 및 메시지를 가정 해 보겠습니다. SQL을 사용하면 구조는 message 테이블로 시작됩니다. 이 표에는 insert 방아쇠가 있습니다. 삽입 트리거는 규칙을 일치시킬 책임이 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

초당 10 개 이상의 메시지를 사용하면 각 일치 항목이 단일 스레드 인 경우에도 처리가 본질적으로 평행합니다. 매치를 병렬화하기 위해 얼마나 많은 노력이 필요할지 모르겠습니다. 데이터베이스의 병렬 처리는 일반적으로 두 SQL 문 사이에있는 것이 아니라 SQL 문 내에 있습니다.

모든 종류의 솔루션이 있습니다. 예를 들어 거대한 저장 프로 시저에서 규칙을 코드로 인코딩 할 수 있습니다. 이는 유지 관리의 악몽이 될 수 있으며 저장 프로 시저의 길이 제한을 초과 할 수 있으며 고통스럽게 느려질 수 있습니다.

또 다른 미친 생각입니다. 테이블에 규칙에 일치하는 메시지를 저장하고 일치하는 규칙 만로드하도록 제약 조건을 지정하십시오. 그러면 귀하의 프로세스는 수천 개의 삽입 문과 같습니다. 일치하는 규칙을 것

select * 
from rules 
where . . . 

결과 집합 :

더 심각하게, 당신은 같은 코드로 더 갈 것입니다. 이다

select * 
from rules r 
where @wordcount > coalesce(r.wordcount, 0) and 
     @topic = coalesce(r.topic, @topic) and 
     . . . 

는, 모든 규칙에 대한 모든 가능한 비교가 where 절에있을 것입니다 다음 where 절은 뭔가처럼 될 수 있습니다. 그리고 규칙은 필요한 절을 식별하기 위해 사전 처리됩니다.

당신은 외부 변수를 생략하고 직접 쿼리를 액세스 할 수 있습니다

select * 
from rules r cross join inserted i 
where i.wordcount > coalesce(r.wordcount, 0) and 
     i.topic = coalesce(r.topic, @topic) and 
     . . . 

그래서, 그래,이 SQL에서 가능하다. 그리고, 당신은 매칭을 병렬로 할 수 있습니다. 데이터베이스 비교에 적합한 형식으로 규칙을 작성하기 만하면됩니다.

+0

이러한 제안을 주셔서 감사합니다. 가장 큰 문제는 본질적으로 매우 다를 수 있기 때문에 규칙을 일반적인 데이터베이스 형식으로 맞추는 것입니다 (다른 연산자, 숫자 값 또는 비교 등 ...) – Thomas

+0

@ 토마스. . . 이것이 컨설턴트가 존재하는 이유입니다. –

1

SQL을 사용하지는 않지만 C#에서 비슷한 문제가 해결되었습니다.

이식성을 위해 데이터베이스에 직렬화 된 XML로 규칙을 저장했습니다.

응용 프로그램 시작시 또는 규칙 테이블이 변경되어 (규칙 캐시가 강제로 플러시되도록) 데이터베이스에서 모든 규칙을로드하고이를 해당 클래스로 deserialize했습니다.

데이터가 각 응용 프로그램 서버에 들어 오면 들어오는 데이터에 대한 규칙을 실행하고 적절한 규칙을 전달하는 규칙을 실행했습니다. (당시에는 앱 서버에서 proc 작업을 실행했지만 대기열에 덤프했습니다.)

이렇게하면 앱 클러스터 전체에서 계산이 분산되어 모든 것을 유지하지 못할 수 있습니다 데이터베이스 시스템에서주기를 빠져 나간다.