Какая привязка WCF наиболее эффективна?
Я должен получить максимальную производительность в моей службе 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 ответа
Msmq, вероятно, будет медленнее, чем TcpBinding.
Если вы работаете на той же машине, вам определенно следует использовать NetNamedPipeBinding (IPC), которая является самой быстрой из доступных привязок.
Вы также должны проверить, как вы сериализуете свои данные. Сериализация протокола буфера намного быстрее (и меньше), чем стандартная двоичная сериализация WCF (но требует небольшой настройки).
Быстрее для одного звонка в изоляции или для потока тысяч звонков?
NetMsmq использует очередь сообщений MSMQ - вы помещаете свое сообщение в очередь, обрабатываемую MSMQ, и служба в конечном итоге получает его из этой очереди и работает над ним. Вы не получаете мгновенную обратную связь, сообщения только односторонние.
NetTcp, с другой стороны, похож на http - только быстрее. Вы отправляете запрос в сервис и сразу же получаете ответ (если все идет хорошо). Очередь сообщений сама по себе не задействована, ваши сообщения - запрос / ответ.
Поэтому я не думаю, что вы можете сравнить эти две привязки, правда. Они служат совершенно другим целям:
если вы хотите, например, найти почтовый индекс и получить долготу / широту этого местоположения, вам определенно нужен механизм запроса / ответа -> используйте netTcp
если вы хотите отправить запросы, например, напечатать документ, или реорганизовать базу данных, или что-то в этом роде - то, к чему в конечном итоге нужно стремиться, но вы не ожидаете немедленного ответа (но вы можете позже проверить, сообщение было обработано правильно), затем используйте систему очередей сообщений
Надеюсь, это прояснит ситуацию - я не думаю, что эти два действительно ориентированы на один и тот же набор операций, поэтому вам, скорее всего, никогда не придется выбирать между этими двумя напрямую:)
Если служба и клиент работают на одной и той же машине, я бы вообще отказался от сети в пользу механизма IPC, такого как именованные каналы. Сетевой трафик влечет за собой много накладных расходов, которых можно избежать с помощью механизма IPC.
Есть ли у вас основания полагать, что транспорт замедляет скорость транзакций? Что вам сказал профилирование? Прямо сейчас этот сервис настроен на однопоточность, а также имеет несколько вызовов "Get", блокирующих друг друга.
Как этот сервис называется / используется? Поможет ли это сделать его многопоточным? А как насчет использования более сложной блокировки, такой как ReaderWriterLock, которая позволяет нескольким вызовам одновременно выполнять Get, но при этом блокировать "Добавить"?
Редактировать: я знаю, что это упрощенная ситуация, но будет ли реальный сервис выгоды от тех же соображений?