2009-05-07 3 views
4

Wir untersuchten MSMQ für persistente Push-Server-Client-Kommunikation. Es kann bis zu 1000 Clients pro Server geben.MSMQ für Server zu Client Comms

In einem unserer Tests haben wir eine kleine Nachricht an 300 Offline-Clients gesendet und anschließend eine Nachricht an einen Online-Client gesendet. Die letzte Nachricht wurde um mehr als 40 Minuten verzögert, als sich MSMQ durch die unzustellbaren Nachrichten arbeitete (beobachtet über die MMC). Wir verwenden auch MSMQ für den Rückweg, wo es gut funktioniert.

Gibt es eine Möglichkeit, MSMQ diesem Nutzungsmuster anzupassen, indem die Zeit verringert wird, die versucht wird, eine Verbindung mit einem Offline-Host herzustellen? Wenn nicht, gibt es ein anderes Produkt in der Warteschlange, das besser passt, oder ist es Ihre eigene Zeit? Der rohe Durchsatz hat keine Priorität, aber die Anzahl der ausgehenden Warteschlangen und Vorhersagbarkeit/maximale Latenz sind ebenso wie der Speicherbedarf auf den Clients (die ziemlich alte Maschinen sein können).

Antwort

0

Unsere Lösung bestand darin, die Warteschlangen programmatisch an Maschinen zu pausieren, die offline waren (wir hatten bereits eine UDP-Nachricht, um festzustellen, ob Clients aktiv sind) über eine der COM-Schnittstellen von MSMQ.

Mit Warteschlangen für pausierte Hosts mit bekannter Verbindungstrennung verbrachte MSMQ viel weniger Zeit mit der Verarbeitung unzustellbarer Nachrichten.

Es war auch eine gute Lektion, ein bisschen Querdenken anzuwenden, wenn man sich Tests für die Bewertung von Technologien ausgedacht hat! Im Allgemeinen würde ich MSMQ nicht für Server-zu-Client-Comms wegen dieses Problems empfehlen - ich würde sagen, eine Abfrage durch Clients wäre vorzuziehen.

2

Sie können die Leistung steigern, indem Sie die Journalfunktion deaktivieren und die Nachrichten nicht wiederherstellbar machen ... wenn Sie sich nicht darum kümmern, dass Nachrichten verloren gehen.

Eine schnelle Lösung mit Ihrem Offline-Szenario könnte sein, die Anzahl der für MSMQ verfügbaren Threads zu erhöhen, die einen Thread pro ausgehende Warteschlange verwenden. Jeder Offlineverbindungsversuch dauert eine Weile und blockiert einen Thread. http://technet.microsoft.com/en-us/library/cc957498.aspx Versuchen Sie, so viele Fäden wie möglich zu werfen.

Meine Kollegen haben mit ActiveMQ gearbeitet und haben gesagt, dass es viel flexibler ist, während es besser funktioniert. Ich habe nicht persönlich damit gearbeitet, aber ich würde mich darum kümmern, wenn Sie nicht an .Net gebunden sind.

+0

Wir brauchten in diesem Szenario wiederherstellbare Nachrichten. Wir haben auch die Anzahl der Threads, die etwas geholfen haben, erhöht, aber die schiere Anzahl der Clients hat es immer noch blockiert. Beide guten Vorschläge aber! –