У меня есть собственная служба 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 slower than MSMQ
}
}
Мой клиент получает 200-килобайтные входы от БД и обрабатывает его с помощью нашего BoundedThreadPool (только создает, допустим, 20 потоков). Каждый вход обрабатывается с помощью другого потока. Каждый поток выполняет MyMethod
, а в конце MyMethod
результат добавляется к bulkManager
.
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
Когда bulkManager
накапливает N элементов (= объем), он передает основную часть другому потоку, все, что он делает, представляет собой очередь, которая содержит один из двух методов:
- Если wcf включен:
wcfQueueService.Send(bulk);
- else, если включен MSMQ:
new MessageQueue(@".\private$\q").Send(new Message {Body = bulk});
Все два метода работают, но MSMQ работает намного быстрее. С клиентом MSMQ удается обрабатывать около 80 тыс. Штук в 20секундах, а с wcf всего 20 КБ-30 тыс. Штук. Я не понимаю, почему это происходит. Мой WCF работает в разных процессах, таких как MSMQ. Кроме того, мой WCF ничего не хранит, у него есть пустой метод. Итак, почему MSMQ выигрывает WCF?
Обновление
Как leppie
предложил попробовать .NetRemoting. NetRemoting действительно улучшил скорость. Клиент обработал 60K. Но,
- Он все еще медленнее, чем MSMQ
- Как я читал .Net Remoting устарел WCF, а WCF должен быть быстрее, чем .Net Remoting в соответствии с this, так почему я получаю что мой wcf медленнее? Может быть, моя привязка неверна?