2009-12-02 3 views
3

Я должен получить максимальную производительность в моей службе WCF. В одном из моих тестов служба ниже получала только 50 тыс. Данных в минуту с помощью NetTcpBinding. Будет ли отключенная привязка, такая как NetMsmqBinding, улучшить эту производительность?Какая привязка WCF наиболее эффективна?

Служба и клиент используют WCF и работают на одном компьютере.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class Storage : IStorage 
{ 
    protected List<int> _data = new List<int>(); 

    public void Insert(int[] data) 
    { 
     lock (_data) 
     { 
      _data.AddRange(data); 
     } 
    } 

    public int[] Get() 
    { 
     lock (_data) 
     { 
      return _data.ToArray(); 
     } 
    } 
} 

Код, приведенный выше, является упрощенной версией настоящего кода.

+2

См. http://stackoverflow.com/questions/1613586/c-wcf-inter-process-communication/1613601#1613601 для блок-схемы о том, как выбирать привязки WCF. Он напрямую не затрагивает вопрос о производительности, но другие, рассматривающие этот вопрос, могут оказаться полезными. –

ответ

4

Msmq, вероятно, будет медленнее, чем TcpBinding.

Если вы работаете на одном компьютере, вам определенно следует использовать NetNamedPipeBinding (IPC), который является самым быстрым связыванием.

Вы также должны проверить, как вы сериализуете свои данные. Сериализация буфера протокола намного быстрее (и более компактная), чем стандартная сериализация WCF по умолчанию (но требует немного настройки).

+0

http://code.google.com/p/protobuf-net/wiki/Performance –

+0

Да. Это одна из двух реализаций, которая имеет довольно хорошую поддержку WCF. слышал, что создатель этой библиотеки не является полностью неизвестным здесь. –

+0

Я использовал его, но это странно не улучшило производительность моего сервиса. –

3

Если служба и клиент работают на одном компьютере, я бы вообще избегал сети в пользу механизма IPC, такого как именованные каналы. Сетевой трафик несет много накладных расходов, которых можно избежать с помощью механизма IPC.

+0

+1 для названных каналов. Позор WCF 4.0 также должен был отменить localProcessBinding :( – MattC

2

У вас есть основания полагать, что транспорт является тем, что замедляет скорость транзакции? Что профилировал вам? В настоящий момент эта служба настроена на однопоточность, а также имеет несколько вызовов «Get», блокирующих друг друга.

Как эта услуга называется/используется? Помогло бы это сделать многопоточность? Как насчет использования более сложного замка, такого как ReaderWriterLock, который позволяет нескольким вызовам «Получать» в одно и то же время, но все же блокировать «Добавить»?

Редактировать: Я знаю, что это упрощенная ситуация, но будет ли фактическое обслуживание выгодным с одних и тех же соображений?

+0

+1 для поднятия проблемы –

+0

Я только что исправил ConcurrencyMode. Спасибо! –

+0

Да, я думаю, что фактическое обслуживание также выиграет от расширенного блокировки. –

4

Быстрее для одиночного вызова в изоляции или для потолка тысяч звонков?

NetMsmq использует очередь сообщений MSMQ - вы помещаете свое сообщение в очередь, обрабатываемую MSMQ, и служба в конечном итоге получит ее из этой очереди и будет работать над ней. Вы не получаете мгновенную обратную связь, сообщения односторонние.

NetTcp, с другой стороны, похож на http - только быстрее. Вы отправляете запрос в службу и возвращаете ответ (если все идет хорошо) сразу. Никакой очереди сообщений не используется, ваши сообщения - это запрос/ответ.

Так что я не думаю, что вы можете сравнить эти две привязки. Они служат совершенно другим целям:

  • если вы хотите, например, найдите почтовый индекс и верните долготу/широту этого местоположения, вам определенно нужен механизм запроса/ответа -> используйте netTcp

  • , если вы хотите отправить запросы, например.распечатать документ или реорганизовать базу данных или что-то в этом роде - что-то, к чему нужно стремиться, в конце концов, но вы не ожидаете ответа сразу (но позже вы можете проверить, правильно ли обработано сообщение) затем использовать сообщение СМО

Надежда, что делает вещи немного яснее - Я не думаю, что эти два действительно ориентированы на тот же набор операций, так что вы, скорее всего, никогда не придется выбирать между эти два непосредственно :)

+0

Если вы загляните в мой код, и если я скажу вам, что каждый клиент использует только одну из операций (один клиентский вкладыш и другой клиент получает), я думаю, мы согласны с тем, что MSMQ подходит для моей службы. Проблема в том, что я никогда не использовал ее, и я не знал, является ли она исполнительной. –

+0

хорошо - если вы хотите «ПОЛУЧИТЬ» что-то, вам нужно отправить запрос «GET» на MSMQ в службу. Но как вы возвращаете данные? Поскольку MSMQ всегда только в одну сторону ........ вам почти нужно открыть другую (откликовую) очередь, на которую служба отправляет ответ, а клиенту нужно ухватить данные оттуда. Нет, я не думаю, что MSMQ - хорошая идея для операции GET, в общем. –

+0

Итак, если я вас хорошо понимаю, мне придется игнорировать этот метод GET из этой службы и преобразовать один из моих клиентов в службу, которая получает данные, чтобы использовать MSMQ? –

Смежные вопросы