У меня есть собственная служба 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 ), он передает большую часть другому потоку, и все, что он делает, это ставит эту массу в очередь одним из двух методов:
wcfQueueService.Send(bulk);
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 тыс. Но