비즈니스 규칙에 따라 예약 된 시간에 데이터베이스에서 장기 실행 작업으로 처리 할 수있는 10,000 - 200,000 개의 행이 필요합니다. 각 행은 개별적으로 처리해야하며 (서로 의존하지는 않습니다) 비동기 적으로 발생하는 것이 좋습니다. 작업의 성공적인 완료는 문서화되어야합니다 (아마도 데이터베이스로).장기 실행 작업을위한 메시지 큐에 대량 데이터베이스 행
메시지 대기열을 사용하는 가장 좋은 방법은 내구성이므로 쉽게 확장 할 수 있습니다. 첫째, 이것이 최상의 솔루션입니까? 그렇다면 데이터베이스의 모든 행을 큐에 넣는 가장 효율적인 방법은 무엇입니까? 모든 행이 큐에 전달되도록 보장하는 방법은 무엇입니까?
참고 : 우리는 C# 3.5, WCF, MSMQ 및 SQL 2005를 사용하는 .Net 팀입니다. NServiceBus를 조사했으며이를 권장한다면이 기능을 기꺼이 사용할 수 있습니다.
데이타베이스가 병목 (처리 된 것으로 표시 할 각 행을 업데이트 중)이라는 걱정이 듭니다. 나는 또한 "트랜잭션 방식으로"메시지를 보내는 방법을 모른다.
- 어떻게 "트랜잭션 방식으로"메시지를 보내나요? 내가 의미하는 바는 다음과 같다 : db로부터 하나의 행을로드하고, 메시지를 보내고, db로 행을 업데이트한다. 업데이트가 실패하면 메시지를 보내지 않습니다.
- 이것은 일반적인 시나리오입니까, 아니면 다른 방식으로해야합니까?
- 내 걱정은 db의 개별 행을 업데이트하면 병목 현상이 발생한다는 것입니다. "트랜잭션 방식으로"여러 개의 메시지를 보낸 다음 데이터베이스를 일괄 적으로 업데이트 할 수 있습니까?
왜 소비자를 완전히 차단합니까? 프로세스가 주기적으로 보이고 소비자가 유휴 상태가되어 대기열에서 더 많은 데이터를 기다립니다. RecieveMessage에서 시간 제한을 사용하면 주기적으로 차단 된 상태를 벗어나 종료 할 제어 메시지를 수신했는지 확인하도록 할 수 있습니다. – GrayWizardx
@GrayWizardx : 좋은 지적입니다. 우리는 Linux이고, 파이프 라인의 머리에서 소스를 닫으면 소비자에게 간단한 EOF가 전파되고 모든 것이 잘 닫힙니다. 저 클로저 다운 작전을 예상하고 있었어. 필요하지 않은 경우 복잡성을 줄입니다. –
감사합니다. 이것은 또한 훌륭한 정보입니다.여러분 중 한 분이 저의 다른 요지를 도울 수 있다면, 좋을 것입니다. db의 병목 현상과 트랜잭션 방식으로 메시지를 보내는 방법에 대해 우려하고 있습니다. – JontyMC