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 p anrufen werde). Alle drei Webserver, sobald ein bestimmtes Ereignis innerhalb der Webanwendung auftritt, sendet eine Nachricht an eine remote private Warteschlange auf dem Server p , das dann jede Nachricht von der Warteschlange verarbeitet und einige ausführt Aufgabe.

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 w1 , w2 oder w3 sie nicht senden oder sie werden nicht von p , Ich kann es einfach nicht sagen. Das heißt, ich vermisse lebenswichtige Ereignisse, die von den Benutzern auf der Webanwendung passieren, aber ich kann keine Fehler finden, die in meinen eigenen Protokollen aufgeführt sind.

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?

War es hilfreich?

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:

    .
  1. Wenn in der Web-App ein Ereignis generiert wird.
  2. Recht, bevor Sie ein Ereignis aus der Web-App über MSMQ senden.
  3. Im Empfänger, wenn Sie eine Nachricht von der Warteschlange erhalten.
  4. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top