1

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

То, как я в настоящее время создаю свои службы, - это многоэтапный процесс. У меня есть часть конфигурации (с использованием 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, пинает и смотрит на все в < услуги/> сбора и нерестится покинуть поток на службу, чтобы ускорить время запуска и каждый поток содержит AppDomain, где служба действительно живет, поэтому, если у службы есть какая-то ошибка, она не выводит систему вниз.

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

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

+0

Неужели это _need_, чтобы быть быстрее, чем это? Если он запускается только один раз в день, это составляет 20 секунд в день. Это недолго. –

+0

Это в основном во время отладки, что она медленнее, поэтому основная область, с которой я пытаюсь выжать производительность. Сами услуги будут работать бесконечно (минус перезагрузки и, конечно же, такие). – RubyHaus

ответ

1

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

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

0

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

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

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

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

+0

20 услуг действительно нецелесообразно - особенно с точки зрения отладки. Мы все еще находимся в разработке, и я предполагаю, что еще есть 10-20 сервисов. Сложность чего-то подобного может легко сходить с карт с точки зрения технического обслуживания. – RubyHaus

+0

Почему это было проблемой обслуживания, если все службы были созданы в одной и той же структуре, использовали ту же инфраструктуру, соглашения об именах и т. Д. Я имею в виду те же технологии ведения журнала, настройки и т. Д. 40 почти одинаковых служб не должны быть сложнее поддерживать один или два, которые не идентичны. –

+0

Ну, многие сервисы используют друг друга (т. Е. Вызов может потребовать вызова другим и т. Д.), Поэтому отладка будет действительно болью против одной «конечной точки», если вы это сделаете (не истинной конечной точкой, но я думаю вы понимаете мою мысль). Не говоря уже о том, что 40 Windows Services просто кажутся интенсивным избытком, особенно если основная часть изменяется, и я должен затем развернуть эти библиотеки DLL в каждом месте. Я мог бы использовать GAC, но это все еще кажется чересчур избыточным. – RubyHaus

Смежные вопросы