Tengo el servicio WCF alojado en la consola con el enlace netNamedPipeBinding
. El servicio tiene un solo método vacío Send(DataTable bulk)
¿Por qué MSMQ es más rápido que 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
}
}
Mi cliente obtiene 200K entradas de base de datos y procesarlo con nuestro BoundedThreadPool (sólo crea, por no decir, 20 hilos). Cada entrada se procesa con hilo diferente. Cada subproceso ejecuta MyMethod
y al final de MyMethod
el resultado se agrega a bulkManager
.
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
Cuando bulkManager
acumula N elementos (= granel) que pasan la mayor parte a otro hilo que todo lo que hace es enqueue que a granel con uno de dos métodos:
- Si WCF habilitado:
wcfQueueService.Send(bulk);
- más si MSMQ habilitado:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
Todos los dos métodos funciona, pero MSMQ funciona mucho más rápido. Con MSMQ, el cliente logra procesar aproximadamente 80 mil palabras en 20 segundos mientras que con wcf solo 20 mil a 30 mil. No entiendo por qué sucede. Mi WCF se ejecuta en un proceso diferente, como lo hace MSMQ. Además, mi WCF no almacena nada, tiene un método vacío. Entonces, ¿por qué MSMQ gana WCF?
Actualizado
Como leppie
sugirió Probé .NetRemoting. NetRemoting de hecho mejoró la velocidad. El cliente procesó 60K. Pero,
- Es todavía más lento que MSMQ
- Al leer .Net Remoting está en desuso por la WCF y WCF debería ser más rápido que .Net Remoting acuerdo con this, ¿por qué me da que mi WCF es más lento? Tal vez mi enlace está mal?
Probablemente encontrará que la comunicación remota es mucho más rápida que MSMQ (se le asignan conductos con nombre, supongo que IPC en la máquina local). – leppie
@leppie, .Net Remoting de hecho mejoró la velocidad. El cliente procesó 60K. Pero, 1 - sigue siendo más lento que MSMQ y 2 - mientras leo. NetNet Remoting está obsoleto por WCF y WCF debería ser más rápido que .Net Remoting según http://msdn.microsoft.com/en-us/library/bb310550 .aspx # wcfperform_topic3d, entonces, ¿por qué entiendo que mi wcf es más lento? – theateist
@theateist: ¿Puedes cambiar tu 'InstanceContextMode' en el servicio a' Single' y 'ConcurrencyMode' a' Multiple'? Luego haz otra prueba. También intente ajustar la configuración de aceleración (en el comportamiento del servicio). –