Ich habe WCF-Dienst in der Konsole mit netNamedPipeBinding
Binding selbst gehostet. Der Dienst hat nur eine leere Methode Send(DataTable bulk)
Warum ist MSMQ schneller als WCF QueueService?
[ServiceContract]
public interface IWcfQueueService
{
[OperationContract]
void Send(DataTable bulk);
}
public class WcfQueueService : IWcfQueueService
{
public void Send(DataTable bulk)
{
// Here would be something like _bulks.Add(bulk);
// BUT, for now it is empty method and still it's slower than MSMQ
}
}
Mein Kunde bekommt 200K Eingaben von DB und verarbeiten sie mit unserer BoundedThreadPool (nur schafft, sagen wir mal, 20 Fäden). Jede Eingabe wird mit einem anderen Thread bearbeitet. Jeder Thread führt MyMethod
aus und am Ende MyMethod
wird das Ergebnis zu bulkManager
hinzugefügt.
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
Wenn bulkManager
ansammelt N Artikel (= bulk) er die Masse zu einem anderen Thread passieren, dass alle es tut, ist enqueue dieser Masse mit einem von zwei Verfahren:
- Wenn WCF aktiviert:
wcfQueueService.Send(bulk);
- sonst, wenn MSMQ aktiviert:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
Alle zwei Methoden funktionieren, aber MSMQ funktioniert viel schneller. Mit MSMQ-Client verwaltet, um etwa 80 KByte Bulks in 20 Sekunden zu verarbeiten, während mit nur 20 KB-30 KByte. Ich verstehe nicht, warum es passiert. Mein WCF läuft in verschiedenen Prozessen wie MSMQ. Außerdem speichert mein WCF nichts, es hat eine leere Methode. Warum MSMQ WCF gewinnt?
Aktualisiert
Als leppie
schlug ich .NetRemoting versucht. NetRemoting hat die Geschwindigkeit tatsächlich verbessert. Der Client hat 60K verarbeitet. Aber
- Es ist immer noch langsamer als MSMQ
- Wie ich .NET Remoting gelesen von WCF ist veraltet und WCF soll schneller sein als .NET Remoting nach this, also warum ich, dass meine Wcf langsamer ist? Vielleicht ist meine Bindung falsch?
Sie werden wahrscheinlich feststellen, Remoting ist viel schneller als MSMQ (gegeben Named Pipes, nehme ich IPC auf dem lokalen Rechner). – leppie
@leppie, .Net Remoting tatsächlich verbessert die Geschwindigkeit. Der Client hat 60K verarbeitet. Aber, 1 - es ist immer noch langsamer als MSMQ und 2- wie ich lese. Net Remoting wird von WCF veraltet und WCF sollte schneller sein als. NET Remoting nach http://msdn.microsoft.com/en-us/library/bb310550 .aspx # wcfperform_topic3d, also warum bekomme ich, dass mein wcf langsamer ist? – theateist
@theatist: Können Sie Ihren 'InstanceContextMode' im Dienst in' Single' und 'ConcurrencyMode' in' Multiple' ändern? Dann mache einen weiteren Test. Versuchen Sie auch, die Drosselungseinstellungen anzupassen (im Servicebetrieb). –