Pergunta

Eu tenho a seguinte configuração e problema com o MSMQ. Com base na experiência anterior com o MSMQ, estou apostando que é algo simples, estou perdendo, mas eu não sei o que é.

a configuração

Eu tenho 3 servidores da Web balanceados (permite chamá-los servidores w1 , w2 e w3 ) e 1 servidor que processa determinados eventos / Dados longe das solicitações da Web (que eu chamo p ). Todos os 3 dos servidores da Web, uma vez que um evento específico ocorre dentro do aplicativo da Web, enviará uma mensagem para uma fila privada remota no servidor p , que irá processar cada mensagem da fila e realizar alguns tarefa.

o problema

Na maior parte - em um palpite 95% do tempo - tudo funciona bem, mas ocasionalmente servidor p não recebe mensagens dos servidores da Web. Isto é porque w1 , w2 ou w3 não está enviando eles ou eles não estão sendo recebidos por p , Eu simplesmente não posso dizer. Isso significa que estou perdendo eventos vitais acontecendo dos usuários no aplicativo da web, mas não consigo encontrar nenhum erro listado em meus próprios logs.

os detalhes

Aqui estão todos os detalhes que posso pensar que pode ajudar a explicar minha configuração e o que eu descobri até agora:

  • A fila privada no servidor p é não transacional.
  • A fila privada tem configuração de permissões para Todos para enviar e receber mensagens.
  • este é o código que uso (c #) para enviar a mensagem para a fila privada remota:

    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);
    
  • Enviando a mensagem usando o código acima não parece jogar uma exceção - se o manipulador de erro no aplicativo da Web teria capturado e registrado, então eu estou assumindo que é enviado.

  • Há filas de saída em w1 , w2 e w3 todos apontando para a fila particular em p - Todos estes estão vazios.
  • em w1 , w2 e w3 eu não consigo ver nenhuma mensagem "letra morta".
  • em p a fila privada está vazia para que as mensagens estejam sendo processadas (que eu posso verificar do meu banco de dados).
  • em p Não há mensagens "letrastas". Há mensagens de diário, mas eles não parecem corresponder a qualquer data / hora recente.
  • Todos os servidores estão executando o Windows Server 2012.

A maioria das mensagens de tempo é enviada, recebida e processada apenas bem, mas sem qualquer padrão visível para mim, às vezes eles não são. Alguém pode ver o que está indo errado? Ou me explique como posso tentar descobrir o que está acontecendo?

Foi útil?

Solução

Tem certeza de que o receptor em P não falha / perde a mensagem de alguma forma?Porque sua fila não é transacional, se de alguma forma o processamento falhar, então é uma mensagem perdida.

De qualquer forma, há muitas causas possíveis por que isso pode falhar. Que tipo de log você tem (depurando / info níveis)?

Eu acho que o seguinte ajudará a rastrear o problema:

    .
  1. Quando um evento é gerado no aplicativo da Web.
  2. logo antes de enviar um evento no aplicativo da Web, via MSMQ.
  3. no receptor quando você recebe uma mensagem da fila.
  4. Desta forma, você poderia pelo menos corresponder mensagens enviadas para mensagens recebidas e para as mensagens processadas.

    Como uma nota lateral, quando você verifica as mensagens de letra morta que o faz no computador de origem e em qualquer lúpulo intermediário, não no destino.Se você não tiver nenhum salto, então eles serão retransmitidos para a fila não transacional de letras mortas nos servidores da Web.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top