Какая привязка WCF наиболее эффективна? - PullRequest
3 голосов
/ 02 декабря 2009

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

Служба и клиент используют 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();
        }
    }
}

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

Ответы [ 4 ]

4 голосов
/ 02 декабря 2009

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

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

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

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

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

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

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

4 голосов
/ 02 декабря 2009

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

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

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

3 голосов
/ 02 декабря 2009

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

2 голосов
/ 02 декабря 2009

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

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

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

...