2013-05-13 2 views
1

SQL에서 구현할 시간을 절약하기 위해 MSMQ로 작업 대기열을 구현하려고합니다. 주위를 읽은 후 나는 MSMQ가 내가 무엇을 제공하지 않을 수도 있음을 깨달았다. 제 계획이 현실적인 MSMQ를 사용하거나 대안을 추천한다면 조언을 좀 해주시겠습니까?작업 대기열로 MSMQ

대기열에서 작업을 선택하는 프로세스 수가 많습니다 (나중에 수평 확장해야 할 수도 있음). 작업이 처리되면이 시간 동안 작업이 필요에 따라 상태별로 다른 프로세스에 잠김 추가 처리를 위해 대기열로 다시 채워 지지만 (상태가 다시 변경됨) 물리적으로 작업은 완료 될 때까지 대기열에 계속 남아 있습니다.

MSMQ는 작업 중에 큐에 메시지를 보관하지 않습니다. 예를 들어 필독 또는 읽을 수 있습니다. 읽기는 대기열에서 메시지를 가져오고 엿보기는 메시지 (상태)를 변경할 수 없습니다. 이 모든 저장을 위해 설계되지 않은 것 같은 데이터 저장소 아마 나쁜로

는 MSMQ를 사용

+0

거래를 사용하면 어떨까요? 트랜잭션이 실패하면 MSMQ는 메시지를 다시받습니다. –

답변

1

감사합니다. 대기열이 트랜잭션 적이 지 않으면 메시지가 디스크에 기록되지 않을 수도 있습니다.

대기열 항목을 원래 위치로 업데이트하는 것이 사용자가 명시한 이유로 지원되지 않습니다.

완전한 블로킹 관계형 DB를 원하지 않으면 memcached과 같은 종류의 메모리 내 캐시 또는 까마귀와 같은 저렴한 오브젝트 DB를 사용할 수 있습니다.

0

RabbitMQ 또는 다른 많은 메시지 대기열을 살펴보십시오. 대부분이 기능을 즉시 사용할 수 있습니다.

예를 들면. RabbitMQ는 당신이 기술하고있는 일을 작업 대기열이라고 부릅니다. 여러 사용자가 동일한 대기열에서 당겨서 동일한 항목을 가져올 수 없습니다. 또한 확인 응답을 사용하고 처리가 실패하면 항목이 대기열에서 제거되지 않습니다.

.NET 예 : https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html

편집 : 자신을 MSMQ를 사용 후에는 아마 지금까지 내가 말할 수있는, 당신이 무엇을하고 있는지 아주 잘 작동합니다. 핵심은 트랜잭션과 여러 대기열을 사용하는 것입니다. 예를 들어, 각 상태는 자신의 대기열을 가져야합니다. 트랜잭션 내에서 발생하기 때문에 한 큐에서 다른 큐로 메시지를 "이동"하는 것은 상당히 안전합니다. 메시지 이동은 본질적으로 상태 변경입니다.

또한 상태와 같은 메시지 메타 데이터를 저장하기 위해 Message Extension 바이트 배열을 사용합니다. 이렇게하면 실제 메시지를 다른 큐로 이동할 때 메시지를 변경할 필요가 없습니다.

일반적으로 MSMQ와 대기열에는 대부분의 프로그래머가 사용하는 것과 다른 패턴 집합이 필요합니다. 그것을 명심하십시오. 당신은 당신이 과정에서 현재 메시지를 훔쳐해야하는 이유에 대한 자세한 정보를 제공 할 수있는 경우

아마도, MSMQ와 그 시나리오를 처리 할 수있는 방법이있을 것입니다. 추가 추적을 위해 항상 데이터베이스를 추가 할 수 있습니다.

관련 문제