Ho un servizio WCF self-hosted in console con binding netNamedPipeBinding
. Il servizio ha un solo metodo vuoto Send(DataTable bulk)
Perché MSMQ è più veloce di QueueService WCF?
[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
}
}
Il mio cliente ottiene 200K ingressi da DB ed elaborare con il nostro BoundedThreadPool (crea solo, diciamo, 20 thread). Ogni input viene elaborato con thread diversi. Ogni thread esegue MyMethod
e alla fine di MyMethod
il risultato viene aggiunto a bulkManager
.
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
Quando bulkManager
accumula N elementi (= massa) che passano la maggior parte di un altro filo che non fa altro che enqueue che rinfusa con uno dei due metodi:
- Se wcf abilitato:
wcfQueueService.Send(bulk);
- else se MSMQ abilitato:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
Tutti e due i metodi funzionano, ma MSMQ funziona molto più velocemente. Con MSMQ il client riesce a processare circa 80K di massa in 20 secondi mentre con wcf solo 20K-30K di massa. Non capisco perché succede. Il mio WCF funziona in diversi processi come MSMQ. Inoltre, il mio WCF non memorizza nulla, ha un metodo vuoto. Allora, perché MSMQ vince la WCF?
Aggiornato
Come leppie
suggerito ho provato .NetRemoting. NetRemoting ha effettivamente migliorato la velocità. Il cliente ha elaborato 60K. Ma,
- E 'ancora più lento di MSMQ
- Mentre leggevo .NET Remoting è deprecato da WCF e WCF dovrei essere più veloce di .NET Remoting secondo le this, quindi perché ho che la mia WCF è più lento? Forse il mio legame è sbagliato?
Probabilmente il remoting è molto più veloce di MSMQ (dati i named pipe, presumo IPC sul computer locale). – leppie
@leppie, .Net Il controllo remoto ha effettivamente migliorato la velocità. Il cliente ha elaborato 60K. Ma, 1 - è ancora più lento di MSMQ e 2- come leggo. Net Remoting è deprecato da WCF e WCF dovrebbe essere più veloce di .Net Remoting secondo http://msdn.microsoft.com/en-us/library/bb310550 .aspx # wcfperform_topic3d, quindi perché ho capito che il mio wcf è più lento? – theateist
@theateist: puoi modificare il tuo 'InstanceContextMode' sul servizio in' Single' e 'ConcurrencyMode' in' Multiple'? Quindi fai un altro test. Prova anche a regolare le impostazioni di limitazione (nel comportamento del servizio). –