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 w1 , w2 et w3 ) et 1 serveur qui traite certains événements / Les données à l'écart des demandes Web (que j'appellerai p ). Tous les 3 serveurs Web, une fois qu'un événement particulier surviennent dans l'application Web, vous enverra un message à une file d'attente privée distante sur le serveur p , qui traitera ensuite chaque message de la file d'attente et effectuera certains tâche.

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 w1 , w2 ou w3 ne les envoie pas ou n'est pas reçu par p , Je ne peux tout simplement pas dire. Cela signifie que je manque des événements vitaux qui se produisent des utilisateurs de l'application Web, mais je ne trouve aucune erreur énumérée dans mes propres journaux.

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 , w2 et 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?

Était-ce utile?

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:

  1. Lorsqu'un événement est généré dans l'application Web.
  2. juste avant d'envoyer un événement à partir de l'application Web, via MSMQ.
  3. dans le récepteur lorsque vous recevez un message de la file d'attente.
  4. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top