Почему MSMQ быстрее WCF QueueService?

У меня есть собственная служба WCF -в консоли с привязкой netNamedPipeBinding. В сервисе есть только один пустой методSend(DataTable bulk)

[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
    }    
}

Мой клиент получает 200 000 входных данных из БД и обрабатывает их с помощью нашего BoundedThreadPool (, создавая, скажем, только 20 потоков ). Каждый вход обрабатывается отдельным потоком. Каждый поток выполняет MyMethodи в конце MyMethodрезультат добавляется к bulkManager.

public void MyMethod(string input)
{            
    var res = ProcessInput(input);
    bulkManager.Add(res);
}

Когда bulkManagerнакапливает N элементов (=bulk ), он передает большую часть другому потоку, и все, что он делает, это ставит эту массу в очередь одним из двух методов:

  1. Если wcf включен:wcfQueueService.Send(bulk);
  2. иначе, если MSMQ включен:new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});

Все два способа работают, но MSMQ работает намного быстрее. Клиенту MSMQ удается обработать около 80 000 пакетов за 20 секунд, а с wcf — только 20 000 -30 000. Я не понимаю, почему это происходит. Мой WCF работает в другом процессе, как это делает MSMQ. Кроме того, мой WCF ничего не хранит, у него пустой метод. Так почему же MSMQ побеждает в WCF?

Обновлено

Как предложил leppie, я попробовал.NetRemoting. NetRemoting действительно улучшил скорость. Клиент обработал 60 тыс. Но

  1. Это все еще медленнее, чем MSMQ
  2. Как я читал,.Net Remoting устарел в WCF, а WCF должен быть быстрее, чем.Net Remoting в соответствии с и , так почему же я понимаю, что мой wcf работает медленнее? Может у меня привязка неправильная?

13
задан theateist 4 July 2012 в 07:53
поделиться