Pregunta

Tengo la siguiente configuración y problema con MSMQ. Sobre la base de la experiencia previa con MSMQ, apuesto a que es algo simple que me estoy perdiendo, pero no sé qué es.

La configuración

Tengo 3 servidores web de carga equilibrada (le llamamos a los servidores w1 , w2 y w3 ) y 1 servidor que procesa ciertos eventos / Datos lejos de las solicitudes web (que llamaré p ). Los 3 servidores web, una vez que se produce un evento en particular dentro de la aplicación web, enviará un mensaje a una cola privada remota en el servidor p , que luego procesará cada mensaje de la cola y lleve a cabo algunos tarea.

El problema

En su mayor parte, en una condenación del 95% del tiempo, todo funciona bien, pero ocasionalmente el servidor p no recibe mensajes de los servidores web. Esto se debe, ya sea porque w1 , w2 o w3 no los envía o no están siendo recibidos por p , Simplemente no puedo decir. Esto significa que estoy perdiendo eventos vitales que suceden de los usuarios en la aplicación web, pero no puedo encontrar ningún error listado en mis propios registros.

Los detalles

Aquí están todos los detalles que puedo pensar en lo que puede ayudar a explicar mi configuración y lo que he descubierto hasta ahora:

  • La cola privada en el servidor p es no transaccional.
  • La cola privada tiene la configuración de permisos para a todos para enviar y recibir mensajes.
  • Este es el código que utilizo (C #) para enviar el mensaje a la cola 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 el mensaje usando el código anterior no parece lanzar una excepción: si hice mi controlador de errores en la aplicación web, la habría atrapado y registrado, así que estoy asumiendo que se envía.

  • Hay colas salientes en w1 , w2 y w3 que apuntan a la cola privada en p - Todos estos están vacíos.
  • en w1 , w2 y w3 No puedo ver ningún mensaje "Dead-letra".
  • en p La cola privada está vacía para que se estén procesando los mensajes (que puedo verificar desde mi base de datos).
  • en p No hay mensajes "Dead-letra". Hay mensajes de revistas, pero no parecen corresponder a ninguna fecha / hora reciente.
  • Todos los servidores están ejecutando Windows Server 2012.

La mayoría de los mensajes de tiempo se envían, reciben y se procesan bien, pero, sin ningún patrón visible para mí, a veces no lo son. ¿Alguien puede ver qué está pasando? ¿O explíame cómo puedo intentar averiguar qué está sucediendo?

¿Fue útil?

Solución

¿Está seguro de que el receptor en P no bloquee / pierde el mensaje de alguna manera?Debido a que su cola no es transaccional, si el procesamiento de alguna manera falla, entonces ese es un mensaje perdido.

De todos modos, hay muchas causas posibles por las que esto podría fallar. ¿Qué tipo de registro tiene (niveles de depuración / información)?

Creo que lo siguiente ayudará a seguir el problema:

  1. cuando se genera un evento en la aplicación web.
  2. justo antes de enviar un evento de la aplicación web, a través de MSMQ.
  3. en el receptor cuando recibe un mensaje de la cola.
  4. De esta manera, al menos podría igualar los mensajes enviados a los mensajes recibidos y a los mensajes procesados.

    Como nota lateral, cuando verifique los mensajes de la letra muerta, lo hace en la computadora de origen y en cualquier lúpulo intermediario, no en el destino uno.Si no tiene algún lúpulo, se transmitirán a la cola de carta muerta no transaccional en los servidores web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top