MSMQ: messages de temps en temps non envoyés ou reçus sans erreur
-
20-12-2019 - |
Question
J'ai la configuration et problème suivants avec MSMQ. Basé sur une expérience antérieure avec MSMQ, je parie que c'est quelque chose de simple, je manque, mais je ne sais tout simplement pas ce que c'est.
la configuration
J'ai 3 serveurs Web à charge équilibré (appelez-les des serveurs
Le problème
Pour la plupart - à une conjecture 95% du temps - tout fonctionne bien, mais parfois du serveur p ne reçoit pas de messages à partir des serveurs Web. C'est soit parce que
Les détails
Voici tous les détails que je peux penser qui peut aider à expliquer ma configuration et ce que j'ai trouvé jusqu'à présent:
- La file d'attente privée sur le serveur p n'est pas transactionnelle.
- La file d'attente privée possède une configuration des autorisations pour tout le monde pour envoyer et recevoir des messages.
-
Ceci est le code que j'utilise (C #) pour envoyer le message à la file d'attente privée distante:
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);
-
Envoi du message à l'aide du code ci-dessus n'apparaît pas de lancer une exception - s'il faisait mon manuel d'erreur dans l'application Web aurait pris et je l'ai consigné, donc je suppose que cela soit envoyé.
- Il y a des files d'attente sortantes sur
w1 , etw2 w3 tout pointant vers la file d'attente privée sur p - Tous ceux-ci sont vides. - sur w1 , w2 et w3 je ne peux voir aucun message "lettre dead-lettre".
- sur p La file d'attente privée est vide afin de traiter les messages (que je peux vérifier de ma base de données).
- sur
p Il n'y a pas de message "lettre de mort". Il y a des messages de journaux mais ils ne semblent pas correspondre à une date / fois récente. - Tous les serveurs sont exécutés Windows Server 2012.
La plupart des messages temporels sont envoyés, reçus et traités correctement, mais sans aucun modèle visible, ils ne le sont parfois pas. Quelqu'un peut-il voir ce qui se passe mal? Ou expliquer à moi comment je peux essayer de déterminer ce qui se passe?
La solution
Êtes-vous sûr que le récepteur sur P ne casse pas / perd le message d'une manière ou d'une autre?Comme votre file d'attente n'est pas transactionnelle, si un traitement en quelque sorte échoue, c'est un message perdu.
Quoi qu'il en soit, il y a beaucoup de causes possibles pourquoi cela pourrait échouer. Quel type de journalisation avez-vous (niveaux de débogage / d'information)?
Je pense que ce qui suit aidera à suivre le problème:
- Lorsqu'un événement est généré dans l'application Web.
- juste avant d'envoyer un événement à partir de l'application Web, via MSMQ.
- dans le récepteur lorsque vous recevez un message de la file d'attente.
De cette façon, vous pouvez au moins correspondre aux messages envoyés aux messages reçus et aux messages traités.
En tant que note latérale, lorsque vous vérifiez les messages de lettre morts, vous le faites sur l'ordinateur source et sur n'importe quel houblon intermédiaire, pas sur la destination.Si vous n'avez pas d'houblon, ils seront ensuite relayés à la file d'attente de lettre décédée non transactionnelle sur les serveurs Web.