MSMQ: Nachrichten, die gelegentlich ohne Fehler gesendet oder empfangen werden
-
20-12-2019 - |
Frage
Ich habe das folgende Setup und ein Problem mit MSMQ. Basierend auf früheren Erfahrungen mit MSMQ Ich wette, dass es etwas einfaches ist, das ich vermisse, aber ich weiß einfach nicht, was es ist.
Das Setup
Ich habe 3 lastbalancierte Webserver (nennen Sie diese Server w1 , w2 und w3 ) und 1 Server, der bestimmte Ereignisse verarbeitet / Daten von Webanfragen (die ich
Das Problem
Zum größten Teil - bei einer Vermutung von 95% der Zeit - alles läuft gut, aber gelegentlich erhält server p keine Nachrichten von den Webservern. Dies ist entweder, weil
Die Details
Hier sind alle Details, von denen ich denken kann, welche möglicherweise mein Setup erklären kann und was ich bisher herausgefunden habe:
- Die private Warteschlange auf dem Server
p ist nicht transaktional. - Die private Warteschlange verfügt über die Berechtigungen für alle , um beide Senden und Empfangen von Nachrichten zu empfangen.
-
Dies ist der Code, den ich (C #) verwende, um die Nachricht an die remote private Warteschlange zu senden:
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);
-
Senden der Nachricht mit dem oben genannten Code scheint keine Ausnahme zu werfen. Wenn es meine Fehlerbehandlung in der Webanwendung erstellt hätte, hätte es ihm gefangen und protokolliert, also sei ich angenommen, dass es gesendet wird.
- Es gibt ausgehende Warteschlangen auf w1 , w2 und w3 Alle zeigen auf die private Warteschlange auf p - Alle diese sind leer.
- auf w1 , w2 und w3 ich kann keine "tote-buchen" -Meldungen sehen.
- auf p Die private Warteschlange ist leer, sodass Nachrichten verarbeitet werden (die ich aus meiner Datenbank überprüfen kann).
- auf p Es gibt keine "toten Buchstaben" -Meldungen. Es gibt Journalbotschaften, aber sie scheinen nicht den letzten Terminen / Zeiten zu entsprechen.
- Alle Server führen Windows Server 2012 aus.
Die meisten Zeitmeldungen werden gesendet, empfangen und verarbeitet, aber ohne jedes Muster, das für mich sichtbar ist, sind sie manchmal nicht. Kann jemand sehen, was schief geht? Oder erklären Sie mir, wie ich versuchen kann, herauszufinden, was passiert?
Lösung
Sind Sie sicher, dass der Empfänger auf P die Botschaft nicht stürzt / verliert?Da Ihre Warteschlange nicht transaktionell ist, falls irgendwie eine Verarbeitung fehlschlägt, ist dies eine verlorene Nachricht.
Jedenfalls gibt es viele mögliche Ursachen, warum dies versagen könnte. Welche Art von Protokollierung haben Sie (Debug / Info-Level)?
Ich denke, das Folgende hilft dabei, das Problem zu verfolgen:
- .
- Wenn in der Web-App ein Ereignis generiert wird.
- Recht, bevor Sie ein Ereignis aus der Web-App über MSMQ senden.
- Im Empfänger, wenn Sie eine Nachricht von der Warteschlange erhalten.
Auf diese Weise können Sie zumindest gesendete Nachrichten an empfangene Nachrichten und zu verarbeiteten Nachrichten übereinstimmen.
Als seitliche Hinweis, wenn Sie nach Totbuchstaben-Nachrichten suchen, tun Sie dies auf dem Quellcomputer und an jedem intermediären Hops, nicht auf dem Ziel eins.Wenn Sie keine Hops haben, werden sie auf den Webservern auf die Warteschlange der nicht transaktionalen Vorschriften weitergeleitet.