1

WCF 및 NetTCP 서비스를 사용하는 엔터프라이즈 수준 응용 프로그램을 작성하는 중입니다. 처음에는 NetTCP를 호기심에서 선택했지만 나중에 관련 데이터 처리량으로 인해 결과를 반환하는 데 5 시간 이상이 걸리는 서비스를 가질 수 있으므로 이후에 가장 적합한 옵션으로 결정했습니다.WCF 자체 호스팅 성능

현재 내 서비스를 생성하는 방법은 여러 단계로 진행됩니다. 일부 구성 요소 (포트 번호, 연결하는 클라이언트의 서버 이름, HTTP 및 NetTCP 등을 사용할지 여부)를 지정하는 구성 요소 (System.Configuration 사용)가 있고 그 아래에 "서비스"모음이 있습니다. 그것. 예를 들어, 여기에 기본 한 모습입니다 같은 : 기본적으로

<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 초가 걸립니다. 나는 스레딩과 AppDomain을 그 값 (각 서비스가 순차적으로 열렸을 때 잠깐 동안 걸리는 데 사용됨)까지 끌어 내려고했지만 실제로는 훨씬 빨라질 수 있다고 생각합니다.

누구든지 의견이 있으십니까? Google 빙 (Bing)은 하나의 서비스를 호스팅하기위한 수많은 예제를 가지고 있지만 실제 응용 프로그램에 대해서는별로 찾아 내지 못하고 있습니다. (슬프게도 "Hello World"는 최종 사용자에게 호소력이 없습니다). 현재 Windows 서비스 및 NetTCP를 통해 여러 서비스를 호스팅하고 계시다면 어떻게 하시겠습니까? 전화가 5+ 시간이 걸릴 수 있습니다 경우

는 첫째, 나는/큐잉을 고려 건축 양식을 다시 부를 것이다 :

+0

더 빨라야합니까? 하루에 한 번만 시작하면 하루에 20 초입니다. 그것은 오랜 시간이 아닙니다. –

+0

주로 디버깅하는 동안 속도가 느려져 성능이 저하되는 주요 영역입니다. 서비스 자체는 무기한으로 실행됩니다 (재부팅 등은 제외). – RubyHaus

답변

1

결국 나는 그것을 알아 냈고 결국 WCF 또는 구성 파일과 관련이 없습니다. AppDomain을 만들 때 우리는 다른 프로젝트의 코드를 훔쳤습니다. 크기가 훨씬 작았고 AppDomains를 만드는 섹션이 SingleDomain 옵션을 사용하고 있음을 발견했습니다. MultiDomain으로 변경하면 총로드가 4 초를 초과하고 메모리 사용량이 ~ 150MB에서 ~ 40MB로 떨어졌습니다.

도움을 주셔서 감사합니다. - 적어도 코드를 다시 검토하게되었습니다!

0

나는 세 가지 제안이있다.

각 서비스가 자체 Windows 서비스에서 실행되는 20 개의 Windows 서비스로 서비스를 분할하는 것을 고려하십시오. 이로 인해 복잡성이 증가하고 메모리 사용량이 늘어나지 만 개별 서비스가 더 빨리 제공 될 수 있습니다.

마지막으로 서비스 생성자에있는 코드에서 불필요한 코드가 있는지 확인하십시오.

+0

20 서비스는 실제로 불가능합니다 - 특히 디버깅 관점에서. 우리는 아직 개발 중이며 아직 구축해야 할 10-20 개의 다른 서비스가 있다고 추측합니다. 그런 것의 복잡성은 유지 관리의 관점에서 쉽게 차트에서 벗어날 수 있습니다. – RubyHaus

+0

모든 서비스가 동일한 프레임 워크에서 생성되고 동일한 인프라 구조, 명명 규칙 등을 사용하는 경우 유지 관리 문제가되는 이유는 무엇입니까? 동일한 로깅 기술, 구성 등을 의미합니다. 40 개의 거의 동일한 서비스는 동일하지 않은 하나 또는 둘보다 유지하기가 더 어렵습니다. –

+0

글쎄요, 많은 서비스가 서로를 활용합니다 (즉, 하나를 호출하면 다른 사람에게 전화를 요구할 수 있습니다). 그래서 디버깅을하면 진정한 엔드 포인트가 아닌 단일 "엔드 포인트"대 고통이 될 것입니다. 당신은 나의 요점을 얻는다). 말할 것도없이, 40 개의 Windows 서비스는 엄청난 잔인 함처럼 보입니다. 특히 코어 조각이 변경되면 모든 위치에 해당 DLL을 배포해야합니다. 나는 GAC 핵심 요소가 될 수 있지만, 여전히 잔인 함이 너무 많이 보인다. – RubyHaus