Вопрос

Я должен получить максимальную пропускную способность в моем сервисе 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();
        }
    }
}

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top