MSMQ:Messaggi di tanto in tanto non inviati o ricevuti senza errori
-
20-12-2019 - |
Domanda
Ho la seguente configurazione e il problema con MSMQ.In base alla precedente esperienza con MSMQ sto scommettendo che essa è qualcosa di semplice, mi manca, ma ho appena don so cosa sia.
Il Programma Di Installazione
Ho 3 server web con carico bilanciato (consente di chiamare loro Server W1, W2 e W3) e 1 server che elabora alcuni eventi/dati via web le richieste (che chiamerò P).Tutti e 3 i server web, una volta che si verifica un evento particolare all'interno dell'applicazione web, invia un messaggio a una coda privata remota sul Server P, che poi ogni messaggio dalla coda e svolgere alcune attività.
Il Problema
Per la maggior parte - a indovinare il 95% del tempo - tutto funziona bene, ma di tanto in tanto il Server P non riceve i messaggi dal server web.Questo è quanto W1, W2 o W3 non sono l'invio di loro o non vengono ricevuti da P, Non posso dire.Questo significa che mi sto perdendo vitale eventi da parte degli utenti di applicazioni web ma non riesco a trovare eventuali errori elencati nel mio log.
Dettagli
Ecco tutti i dettagli posso pensare che può aiutare a spiegare il mio setup e quello che ho capito finora:
- La coda privata sul Server P non è transazionale.
- La coda privata dispone di autorizzazioni per l'installazione Tutti sia di Inviare e Ricevere Messaggi.
Questo è il codice che uso io (C#) per inviare il messaggio alla coda privata 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);
Di inviare il messaggio utilizzando il codice di cui sopra non sembrano generare un'eccezione - se lo ha fatto il mio gestore di errore nell'applicazione web, avrebbe catturato e registrato, così sto assumendo è inviato.
- Ci sono code in uscita su W1, W2 e W3 tutti rivolti al privato coda P - tutti questi sono vuoti.
- Su W1, W2 e W3 Non sono "morti-lettera" i messaggi.
- Su P il privato coda è vuota in modo che i messaggi sono in corso di elaborazione (che posso verificare dal mio database).
- Su P non ci sono "morti-lettera" i messaggi.Ci sono i messaggi diario, ma non sembra corrispondere alla recente data/tempi.
- Tutti i server sono in esecuzione Windows Server 2012.
La maggior parte del tempo i messaggi vengono inviati, ricevuti e trattati bene, ma, senza alcun motivo evidente, a volte non sono.Chiunque può vedere che cosa sta andando male?O mi spieghi come posso provare a capire che cosa sta accadendo?
Soluzione
Sei sicuro che il ricevitore P non crash/perdere il messaggio in qualche modo?Perché la coda non è transazionale, se in qualche modo l'elaborazione ha esito negativo che si è perso il messaggio.
Comunque, ci sono molte possibili cause per cui questo potrebbe non riuscire.Che tipo di accesso hai (DEBUG/INFO livelli)?
Ritengo che i seguenti aiuterà a rintracciare il problema:
- Quando viene generato un evento nel web app.
- A destra prima di inviare un evento dal web app, tramite MSMQ.
- Il ricevitore quando si riceve un messaggio dalla coda.
In questo modo si poteva almeno pareggiare i messaggi inviati i messaggi ricevuti e trattati messaggi.
Come nota a margine, quando si controlla per morto-lettera messaggi di farlo sul computer di origine e su qualsiasi intermediario luppolo, non la destinazione.Se non si dispone di uno qualsiasi di luppolo, poi saranno passati non recapitabili coda sul server web.