Самый быстрый способ связи со службой Windows

Мы запускаем службу, которая требует быстрой связи с другим процессом. В настоящее время мы используем WCF NetNamedPipeBinding в буферизованном режиме для вызова методов в службе, что, по-видимому, предлагает наименьшие накладные расходы из доступных привязок WCF. Есть ли более быстрый способ сделать это с помощью управляемого кода?

Изменить: группировка запросов, как предложено ниже, уже рассмотрена. Действительно, нам интересно, существует ли альтернативный API для межпроцессного взаимодействия, который превосходит WCF с использованием именованных каналов.


person spender    schedule 17.02.2009    source источник


Ответы (2)


Если вы используете WCF, то именованные каналы — это самый быстрый способ связи в локальной системе.

Если вы перебрасываете много данных, вы можете изучить потоковую передачу своих API (просто добавили System.IO.Stream в качестве параметра вместо передачи массива или строки и т. д.).

Кроме того, для производительности очень важна ваша модель хостинга в отношении режима вашего экземпляра службы. Книга Юваля Лоуи по WCF на самом деле очень хороша, когда вы переходите от примеров кода к сути его книги.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий взгляните на атрибут «ServiceBehaviour», который вы можете применить к определению службы. (не ваше описание IServiceInterface, а ваша конкретная реализация вашего класса).

Вы можете определить свой код для экземпляра с помощью PerCall, PerSession или Singleton. По умолчанию используется singleton PerSession (спасибо @RichardOD) с режимом параллелизма, установленным на single, и instanceContextMode, установленным на true, что позволяет вам размещать WCF в форме Windows и не дает вам выстрелить себе в ногу, если вы не понимаю инстанцирования.

По сути, если вы оставите его по умолчанию, вы получите однопоточный, последовательно обрабатываемый хост WCF.

В MSDN есть разумная информация о том, что делает каждый тип.

person Spence    schedule 17.02.2009
comment
Спенс, не могли бы вы конкретизировать, что вы подразумеваете под режимом экземпляра службы. В настоящее время он работает как собственный ServiceHost, который, в свою очередь, размещается в стандартной службе Windows. - person spender; 17.02.2009
comment
@Спенс. По умолчанию используется не Singleton, а PerCall или PerSession в зависимости от того, поддерживает ли канал сеансы. - person RichardOD; 18.09.2009
comment
1 балл @RichardOD. Мои извинения, я перепутал, что с однократным ConcurrencyMode по умолчанию, к которому я пытался добраться, настройки по умолчанию - нулевой параллелизм, который повлияет на масштабируемость. - person Spence; 18.09.2009

Что ж, вы ограничены по объему (т. е. большие сообщения) или ограничены по объему (много маленьких сообщений)?

Для больших сообщений рассмотрите возможность сжатия (если сетевой ввод-вывод является накладным) или более эффективную сериализацию, такую ​​как protobuf-net.

Для API-интерфейсов чата рассмотрите возможность группирования сообщений, чтобы сократить количество круговых поездок.

person Marc Gravell    schedule 17.02.2009
comment
Это будет более болтливый API. Одно из его назначений — обслуживать запросы автозаполнения с веб-страницы, поэтому группировка в этом случае невозможна, но в других случаях это должно сократить трафик в два-десять раз. - person spender; 17.02.2009