MSMQ : 때때로 오류없이 보내거나받지 않음
-
20-12-2019 - |
문제
MSMQ에 다음 설치 및 문제가 있습니다. MSMQ와의 이전 경험을 바탕으로 나는 그것이 단순한 것이 뭔가있는 것입니다. 그러나 나는 그것이 무엇인지 모르겠다.
설정
3 개의로드 밸런스 웹 서버가 있습니다 (서버 W1 , w2 및 w3 ) 및 특정 이벤트를 처리하는 1 개의 서버 / 웹 요청에서 멀리 떨어져있는 데이터 ( p 라고 부를 것인가). 웹 서버의 모든 3 개의 웹 서버는 웹 응용 프로그램 내에서 특정 이벤트가 발생하면 서버 p 에 대한 원격 개인 대기열에 메시지를 보냅니다.이 메시지는 대기열에서 각 메시지를 처리하고 일부를 수행합니다. 작업.
문제
대부분의 경우 - 시간의 추측 95 %에서 모든 것이 잘 실행되지만 때로는 서버 p 은 웹 서버에서 메시지를 수신하지 않습니다. 이것은 w1 , w2 또는 w3 이 그들을 보내지 않거나 p 에 의해받지 못하고 있기 때문입니다. 나는 단지 말할 수 없다. 즉, 웹 응용 프로그램의 사용자에서 일어나는 중요한 이벤트가 없지만 내 로그에 나열된 오류를 찾을 수 없습니다.
세부 사항
여기에 내가 설정하는 데 도움이 될 수있는 모든 세부 사항이 있으며 지금까지 알아 냈던 것을 설명하는 데 도움이 될 수 있습니다 :
- 서버 p 의 개인 큐는 비 트랜잭션입니다.
- 개인 대기열에는 Everyone Everyone Everyone 모두에게 사용 권한 설정이 있습니다.
-
이것은 내가 사용하는 코드 (C #)가 원격 개인 대기열에 메시지를 보내려면 다음과 같습니다.
var queue = new MessageQueue(@"FormatName:DIRECT=OS:ServerP\PRIVATE$\MyMessageQueue"); var defaultProperties = queue.DefaultPropertiesToSend; defaultProperties.AcknowledgeType = AcknowledgeTypes.FullReachQueue | AcknowledgeTypes.FullReceive; defaultProperties.Recoverable = true; defaultProperties.UseDeadLetterQueue = true; defaultProperties.UseJournalQueue = true; queue.Send(requestData);
-
위의 코드를 사용하여 메시지를 보내는 것은 예외를 던지지 않는 것처럼 보이지 않습니다. 웹 응용 프로그램에서 내 오류 처리기가 잡히고 기록했을 때,
- w1 , w2 및 w3 p 의 개인 대기열을 가리키는 w3 에 대한 나가는 대기열이 있습니다. 이 모든 것이 비어 있습니다.
- w1 , w2 및 w3 은 "죽은 편지"메시지를 볼 수 없습니다.
- 켜짐 p 개인 대기열이 비어 있으므로 메시지가 처리됩니다 (데이터베이스에서 확인할 수 있음).
- p "데드 - 문자"메시지가 없습니다. 저널 메시지가 있지만 최근 날짜 / 시간과 일치하지 않는 것 같습니다.
- 모든 서버가 Windows Server 2012를 실행 중입니다.
대부분의 시간 메시지는 괜찮아지고 받고 처리하지만, 나에게 가시적 인 패턴이 없으면 때로는 그렇지 않습니다. 누구든지 잘못된 것을보아야 할 수 있습니까? 또는 내가 무슨 일이 일어나고 있는지 알아낼 수있는 방법을 설명하고 설명하는 방법을 설명해 주시겠습니까?
해결책
P의 수신자가 어떻게 든 메시지를 잃지 않습니까?대기열이 트랜잭션이 아닌 경우, 어떻게 든 처리가 실패하면 잃어버린 메시지가 하나입니다.
어쨌든, 이것이 실패 할 수있는 많은 원인이 많이 있습니다. 어떤 종류의 로깅이 있습니까 (디버그 / 정보 수준)?
다음은 문제를 추적하는 데 도움이됩니다.
- 웹 응용 프로그램에서 이벤트가 생성되면
- MSMQ를 통해 웹 앱에서 이벤트를 보내기 전에
- 대기열에서 메시지를 가져올 때 수신기에 있습니다. 이 방법으로 보낸 메시지를 수신 된 메시지 및 처리 된 메시지에 적어도 일치시킬 수 있습니다.
사이드 메모로서, 원본 컴퓨터와 대상 하나가 아닌 소스 컴퓨터 및 중개 홉에있는 모든 중개 홉에서 그렇게하는 데 사용되는 데드 - 문자 메시지를 확인하십시오.홉이 없으면 웹 서버의 트랜잭션이 아닌 데드백 큐에 릴레이됩니다.