WCF Self Hosting Performance - PullRequest
       19

WCF Self Hosting Performance

1 голос
/ 20 июня 2009

Я нахожусь в процессе написания приложения уровня предприятия, использующего сервисы WCF и NetTCP. Изначально я выбрал NetTCP из любопытства, но позже определил, что это лучший вариант для меня, поскольку у меня могут быть вызванные сервисы, которые возвращают результаты в течение 5+ часов из-за большого объема данных.

То, как я в настоящее время порождаю свои сервисы, является многошаговым процессом. У меня есть часть конфигурации (с использованием System.Configuration), которая задает некоторые вещи по умолчанию (номер порта, имя сервера для клиентов, подключающихся к нему, нужно ли включать HTTP, а также NetTCP и т. Д.), И в которой есть коллекция «служб» под Это. Например, вот как выглядит основной:

<serverConfiguration tcpListenerPortNumber="60000" httpGetEnabled="true" httpListenerPortNumber="6000" serverName="localhost" retryEnabled="true" retryInterval="5" maxRetryAttempts="3">
    <services>
        <add virtualDirectory="Service1" applicationName="Service1" assembly="SampleService" type="SampleService.Service1" />            
    </services>
</serverConfiguration>

По сути, здесь происходит то, что моя служба Windows запускает и просматривает все в коллекции и порождает поток для каждой службы, чтобы ускорить время запуска, и каждый поток содержит домен приложений, где служба действительно живет, так что если служба есть какая-то ошибка, которая не приводит к выходу системы из строя.

«Проблема», с которой я сталкиваюсь, заключается в том, что это приложение содержит около 20 служб, и для запуска и запуска всех служб требуется 15-20 секунд. Я выполнил работу с потоками и частями AppDomain, чтобы привести его к этому значению (раньше это занимало более минуты, так как каждый сервис открывался последовательно), но мне все еще кажется, что на самом деле это может идти намного быстрее.

У кого-нибудь есть предложения? Google В Bing есть множество примеров для размещения одного сервиса, но я не нахожу много для реальных приложений (к сожалению, "Hello World" просто не нравится конечным пользователям). Если вы в настоящее время размещаете несколько служб через Windows Service и NetTCP, как вы это делаете?

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Я наконец-то понял, и это не имело никакого отношения к WCF или моим конфигурациям. Когда я создавал домен приложений, я украл код из другого нашего проекта, который был намного меньше по размеру, и обнаружил, что раздел создания доменов приложений использует опцию SingleDomain. Изменение этого параметра на MultiDomain привело к тому, что общее время загрузки и использования памяти сократилось до 4 секунд, а использование памяти сократилось до ~ 40 МБ с ~ 150 МБ.

Спасибо за помощь - по крайней мере, я снова просмотрел код!

0 голосов
/ 21 июня 2009

У меня есть три предложения:

Во-первых, если вызов может занять более 5 часов, я бы рассмотрел архитектуру стиля очереди / обратного вызова.

Рассмотрите возможность разделения ваших служб на 20 служб Windows, где каждая служба работает в своих собственных службах Windows. Это добавляет сложности и увеличивает использование памяти, но отдельные услуги могут быть доступны быстрее.

Наконец, проверьте код, который находится в конструкторе службы, на наличие ненужного кода.

...