Frage

Ich muß die maximale Durchsatzleistung in meinem WCF-Dienst bekommen. In einem meiner Tests unter der Service bekam nur 50k Datenelemente pro Minute NetTcpBinding. Würde diese Leistung einer getrennte Bindung wie NetMsmqBinding verbessern?

Service und Client verwendet WCF und in der gleichen Maschine laufen.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
    ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Storage : IStorage
{
    protected List<int> _data = new List<int>();

    public void Insert(int[] data)
    {
        lock (_data)
        {
            _data.AddRange(data);
        }
    }

    public int[] Get()
    {
        lock (_data)
        {
            return _data.ToArray();
        }
    }
}

Der obige Code ist eine vereinfachte Version des aktuellen Code.

War es hilfreich?

Lösung

Msmq ist wahrscheinlich als TcpBinding langsamer sein.

Wenn Sie auf der gleichen Maschine laufen lassen, sollten Sie auf jeden Fall verwenden NetNamedPipeBinding (IPC), das ist die schnellste Bindung zur Verfügung.

Sie sollten auch prüfen, wie Sie Ihre Daten sind Serialisierung. Protocol Buffer Serialisierung viel schneller (und magerer) als Standard WCF binäre Serialisierung (erfordert aber ein wenig Zwicken).

Andere Tipps

Faster für einen Anruf in Isolation oder für eine Flut von Tausenden von Anrufen?

NetMsmq verwendet MSMQ Message Queuing - Sie setzen Ihre Nachricht in eine von MSMQ behandelt Warteschlange, und der Dienst wird es aus dieser Warteschlange schließlich bekommen und daran arbeiten. Sie erhalten nicht eine sofortige Rückmeldung, die Nachrichten nur in eine Richtung.

NetTcp auf der anderen Seite ist wie http - nur schneller. Sie senden eine Anfrage an den Service und eine Antwort erhalten sofort zurück (wenn alles gut geht). Keine Message Queuing per se beteiligt, Ihre Nachrichten Anfrage / Antwort.

So denke ich nicht, dass Sie die beiden Bindungen vergleichen können, wirklich. Sie dienen ganz anderen Zwecken:

  • Wenn Sie möchten, zum Beispiel zu suchen eine Postleitzahl und die Länge / Breite dieser Position zurück, möchten Sie auf jeden Fall einen Request / Response-Mechanismus -> verwenden NetTcp

  • Wenn Sie Anfragen deponieren, um z.B. Drucken eines Dokuments oder einer Datenbank reorganisieren, oder etwas in der Natur - etwas, das schließlich werden neigten muss, aber man nicht erwarten, wieder eine Antwort sofort (aber Sie können später überprüfen, ob die Nachricht richtig behandelt wurde), verwenden, um ein Message-Queuing-System

    und

Hoffnung, dass die Dinge etwas klarer macht - ich glaube nicht, diese beiden wirklich sind darauf ausgerichtet, den gleichen Satz von Operationen, so dass Sie wahrscheinlich nicht immer direkt zwischen diesen beiden wählen müssen:)

Wenn der Dienst und Client auf demselben Rechner laufen ich das Netzwerk insgesamt zugunsten eines IPC-Mechanismus wie Named Pipes vermeiden würde. Der Netzwerkverkehr verursacht eine Menge Aufwand, der durch die Verwendung eines IPC-Mechanismus vermieden werden kann.

Haben Sie Grund zu der Annahme, dass der Transport ist es, was die Transaktionsrate verlangsamt? Was hat Sie Profilierung erzählt? Im Moment wird dieser Service eingestellt Single-Threaded zu sein, und hat auch mehrere Anrufe auf „Get“ sperren sich gegenseitig aus.

Wie wird dieser Dienst namens / verwendet? Würde es helfen, es mit mehreren Threads zu machen? Was ist eine anspruchsvolleres Sperre wie ein ReaderWriterLock verwendet, die zur gleichen Zeit auftreten Get mehr Anrufe erlaubt, aber immer noch blockiert auf „Hinzufügen“?

Edit: Ich weiß, dass dies eine vereinfachte Situation ist, aber würde der tatsächliche Service benifit aus den gleichen Erwägungen

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