문제

외부 시스템에 대한 이벤트와 작업을 신뢰할 수있는/거래 방식으로 대기해야합니다. MSMQ 또는 ActiveMQ와 같은 것을 사용하는 것은 매우 매혹적인 것처럼 보이지만 거래 부분은 복잡해집니다 (MSDTC 등).

데이터베이스 (SQL Server 2005+, Oracle 9+)를 사용할 수 있고 더 쉬운 트랜잭션 지원을 달성 할 수 있지만 대기열 부분이 추악 해집니다.

어느 경로도 그렇게 훌륭해 보이며 불쾌한 Gotchas와 Edge Case로 가득 차 있습니다.

누군가이 문제에 대해 실용적인 지침을 제공 할 수 있습니까?

생각 : E/C/A 또는 예정된 작업 엔진이 너무 자주 깨어나서 현재 실행 해야하는 예정된 작업이 있는지 확인합니다 (예 : 차세대 날짜가 통과되었지만 만료 날짜는 아직 없었습니다. 도달했다).

도움이 되었습니까?

해결책

당사의 시스템에는 60 개의 컴퓨터가 있으며 각각의 12 개의 작업 (스레드)이있어 "다음 작업을해야합니다". 대체로, 그것은 하루에 50k "일자리"로 온다. 분당 몇 개의 트랜잭션 수에 대한 수학을 수행하고 작업 시간이 가변적이라는 사실을 인식하므로 정확히 동시에 여러 "POP"이벤트를 얻을 수 있습니다.

MSMQ를 사용하여 첫 번째 버전이있었습니다. 결론: 멀리있어. 부하 및 동기화 문제로는 잘 작동했지만 두 가지 문제가있었습니다. 하나의 성가신 것과 하나의 거래 차단기.

성가신: Enterprise Software로서 MSMQ는 고객 네트워크 관리자와 설정하고 싸울 수있는 보안 요구를 가지고 있습니다.

계약 위반: 그런 다음 우리는 다음 직업을 가고 싶었지만 간단한 팝을 사용하지는 않았지만 "다음 Blue Job get"또는 "Next Yellow Job"과 같은 것을 사용했습니다. 할 수 없습니다!

우리는 Plan B : 단일 SQL 2005 테이블로 자체 Q를 구현했습니다. 더 행복 할 수 없었습니다

나는 하루에 200k 메시지로 테스트하고 일했다. 우리는 "다음"논리를 우리가 원하는만큼 복잡하게 만들 수 있습니다.

캐치 : 다음 항목을 사용하는 SQL에 매우주의해야합니다. 빠르고 잠금을 원하기 때문에. 매우 중요한 SQL이 2 개 있습니다 힌트 우리는 일부 연구를 기반으로 사용했습니다. 마법은 다음과 같이 간다 :

SELECT TOP 1 @Id = callid
FROM callqtbl WITH (READPAST, XLOCK)
where 1=1 ORDER BY xx,yy

다른 팁

MSMQ가 트랜잭션으로 사용되는 것을 보았고 특히 복잡해 보이지 않았습니다. 트랜잭션 스코프는 데이터베이스 액세스와 함께 eNqueue 또는 dequeue 호출을 포장했으며 큐가 생성되면 트랜잭션으로 정의 된 한 모든 것이 잘되었습니다. 메시지 브로커 인 ActiveMQ에서는 이것이 사실이라고 생각하지 않지만 MSMQ는 각 엔드 포인트 머신에 로컬로 설치되므로 큐에 트랜잭션으로 항목을 얻는 데 멋진 분산 트랜잭션이 필요하지 않습니다.

당신은 이미 이것을 알고 있지만 .NET에는 MSMQ에 대한 약간의 추상화를 제공하는 가벼운 라이브러리가 몇 개 있습니다 (및 이론적으로 다른 전송).

nservicebus : www.nservicebus.com

대중 교통 : http://code.google.com/p/masstransit/

또한 Oren Eini는 실험적인 파일 시스템 기반의 트랜잭션 대기열이 있습니다. 이 라이브러리의 이점은 MSMQ와 달리 라이브러리로 배포 될 수 있으며 MSMQ 배포의 유지 보수 두통이 필요하지 않다는 것입니다.

여기에서 읽을 수 있습니다. http://ayende.com/blog/archive/2008/08/01/rhino.queues.storage.disk.aspx

또한 SQL Server 2005는 SQL Server Service Broker를 사용하여 상당히 우아하게 대기열을 처리하지만 각 엔드 포인트에 SQL Server가 설치되어 있어야하며 SSB가 방화벽을 가로 지르는 지 모르겠습니다.

마지막으로, 여기에서 찾고있는 답을 얻지 못하면 NServiceBus 토론 포럼을 적극 권장합니다. Udi Dahan은 그의 작은 메시지 지향 추종자들과 함께 이러한 종류의 질문에 답변하며, 대기열 지향적 질문에 신속하고 유능하게 대답하는 것이 지금까지 찾은 최고의 자료입니다. 그 포럼은 여기에 있습니다. http://tech.groups.yahoo.com/group/nservicebus/

quartz.net 오픈 소스 작업 스케줄링 시스템입니다.

이것이 MSMQ가 트랜잭션과의 대기열을 위해 설계된 것입니다. 그렇지 않은 경우 SQL Server의 "Service Broker"기능 - 'CSMBA'가 그의 대답에 설명하는 "SQL 테이블의 큐"인 "서비스 브로커"기능을 확인하지만 잘 포장 된 통합 SQL 서버 구성 요소입니다. 그리고 당신의 사용을 위해 노출.

WebSphere MQ (MQ Series)가 옵션입니까? IS는 거래 메시징을 지원합니다.

이름이 지정된 Oracle 기능을 볼 수 있습니다 고급 대기열

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top