2013-02-12 4 views
0

데이터가 하나의 큐에 푸시되고있는 MSMQ 응용 프로그램 설치가있었습니다. 처음에는 한 프로세스 만 읽고 처리했습니다. 볼륨이 증가했기 때문에 기본적으로 원래 프로세스의 새로운 인스턴스 인 여러 프로세스를 읽기 시작했습니다. 오류는 보이지 않지만 성능이 떨어졌습니다. 나의 이해는 각 프로세스가 대기열에서 읽고 아직 처리되지 않은 새 메시지를 수신하여 계속 진행한다는 것입니다. 이것이 맞습니까, 아니면 여러 프로세스가 같은 메시지를 처리하게 될 수 있습니까?여러 프로세스가 표시된 MSMQ 큐

Dim q As MessageQueue 
    If MessageQueue.Exists(".\private$\MsgsIQueue") Then 
     q = New MessageQueue(".\private$\MsgsIQueue") 
    Else 
     'GS - If there is no queue then we're done here 
     Console.WriteLine("Queue has not been created!") 
     Return 
    End If 

    While True 
      Dim message As Message 
      counter += 1 
      Try 
       If q.Transactional = True Then 
        Thread.Sleep(2000) 
       End If 
       q.MessageReadPropertyFilter.ArrivedTime = True 
       message = q.Peek(TimeSpan.FromSeconds(20.0)) 
       message.UseJournalQueue = True 
       message = q.Receive(New TimeSpan(0, 0, 60)) 
       message.Formatter = New XmlMessageFormatter 
            (New [String]() {"System.String"}) 
       ProcessMessage(message) 
       .... 

답변

2

좋아요, 실제로 성능 저하를 일으키는 큐 읽기입니까? MSMQ는 여러 프로세스/스레드에서 읽기를 처리 할 때 실제로 유용하기 때문에 파이프 라인에 다른 병목 현상이 있다고 의심됩니다.

난 당신의 코드를 살펴 나는 다음과 같이 변경 제안을하는 경우 :

  • 왜 TX 큐의 경우 2 초에 잠을? 대기열이 비어 있으면 항상 대기열을 사용하고 대기열을 catch 블록으로 이동하여 대기 간격을 확보하십시오.

  • 루프 밖에서 필터 설정을 이동하십시오.

  • 아무 가치도 수행하지 않으므로 Peek에 대한 호출을 제거하십시오.

  • 사용 저널 큐는 메시지를 보낼 때만 사용됩니다. 그래서 그것을 제거하십시오.

  • 대기열에 포맷터를 설정하면 모든 읽기에 사용됩니다.

또한 다른 try/catch 블록에서 ProcessMessage를 래핑하는 TransactionScope 내에서 Read 및 ProcessMessage에 대한 호출을 포장해야합니다. 이렇게하면 모든 것이 ProcessMessage에서 Ok가되거나 읽기를 중단하거나 메시지를 데드 레터 큐로 이동하도록 선택한 경우 읽기를 커밋 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을보고 당신의 제안을 적용했다. 여기 게시 한 후에 나는 두개 이상의 프로세스를 해고하고 결과적으로 대기열은 프로세스가 원활하게 실행되도록 비워 두었습니다. 그렇습니다. 실제로 여러 프로세스를 쉽게 처리 할 수 ​​있도록 처리되었습니다. – vbNewbie