2009-10-22 5 views
1

나는 다음과 같은 설정으로 WCF 서비스를 가지고 이 WCF 서비스에 멀티 스레드 방식으로 액세스하는 클라이언트가 있습니다.WCF ConcurrencyMode.Multiple 연결 모범 사례와 캐싱

내가 아는 한 서로 다른 스레드를 차단하는 스레드를 피하기 위해 각 스레드마다 서비스에 대한 새 연결을 열어야한다. 이 경우

  • 얼마나 비싼 Open() 호출 (서비스는 동일한 컴퓨터에)있다?
  • 내 클라이언트 클래스를 캐시하거나 풀링할까요? (ClientBase에서 파생됩니까?) 또는 WCF는 SQLConnection Pooling과 유사한 연결을위한 투명한 풀을 제공합니까?
+0

NetNamedPipe on-machine 통신과 같은 시나리오에서 ConcurrencyMode의 추가 된 복잡성은 이점으로 볼 수 없습니다. 이것은 단지 서비스 코드를 훨씬 복잡하고 에러가 발생하기 쉬운 것으로 만듭니다 .... 클라이언트 프록시 생성에 저장된 몇 나노초와 비교할 때 문제가 발생할 수 있고 유지 보수가 필요하다면 잘 모르겠습니다 ..... –

+1

멀티 스레드로 작동하지 않을 것입니다. 즉, 클라이언트에서 멀티 쓰레드는 서로 기다릴 것이므로 무의미합니다. 밀리 세컨드 콜이 아니라 초입니다. 아니면 나는 무엇이든 놓치고있다. –

답변

3

불행히도 WCF는 클라이언트 연결을 풀지 않습니다. 나는 Open()이 상대적으로 느리고 클라이언트와 서버간에 소수의 지속적인 연결을 유지하면서 내 자신의 풀링 메커니즘을 구축했다.

클라이언트와 서버 사이에 (또는 모든 종류의 CommunicationException이 발생하는 경우에도) 간단한 제한 시간이 발생하면 클라이언트 인스턴스가 Faulted 상태가되어 사용할 수 없게됩니다. 어느 순간에 당신은 그것을 파괴하고 새로운 인스턴스로 대체해야합니다.

+0

아! 그건 꽤 쓰레기 야. 사실 이미 캐싱 시스템을 구축했지만 복잡한 점을 선호하지 않습니다. 설명 +1을 주셔서 감사합니다. –

+0

NetNamedPipe 바인딩을 사용하여 "컴퓨터 전용"호출 시나리오에서 Open() 호출이 느리다는 것을 의심합니다. 예, WS- * 기능 오버 헤드가 많은 wsHttpBinding (기본값)을 사용하면 속도가 느려질 수 있습니다.하지만 명명 된 파이프는 매우 효율적이며 보안이 적용되지 않는 시스템에서만 사용할 수 있습니다. –

+1

심지어 NetNamedPipe와 함께해도 위보다 더 많은 오버 헤드가 있습니다. 진지하게 소용돌이 치다. 내 lappy에서 나는 150ms에서 350ms에 instantion 시간 범위를 보았습니다. 나는 파푸아/서브를 파수꾼/클라이언트의 수영장 앞에두고 결국 꽤 멋진 공연을 보았다. –

1

제임스 알렉산더 (James Alexander)의 답변은 (직접 연결을 풀어 놓아야합니다.)하지만 나는 ClientBase 위에 연결 풀링을 추가하는 구현을 설명하는 a link to a blog entry을 게시 할 것이라고 생각했습니다. Here's the follow up post 그가 세부 사항으로 들어가고 코드를 다운로드하기위한 링크를 제공합니다.

+0

좋은 물건, 특히 벤치마킹. 코드는 어때? :) 이미 캐싱을 추가했지만 구현이 멋지게 보입니다. 스 니크 픽을 사용하는 것이 좋습니다. –

+0

블로그 게시물은 실제로 내 것이 아닙니다 (신용을 훔치고 싶지는 않습니다!). 나는이 주제를 전에 연구했기 때문에 그것에 대해서 알고 있습니다.나는 그가 당신에게 그의 세부 사항 및 부호를 실제로주는 곳에 그의 연결에 다른 연결을 주었음에 틀림 없다. 나는 입장을 편집 할 것이다. –

+0

작전! 나는 그것이 어쨌든 확실히 포인트를 증명할 좋은 링크라고 생각하는 것을 본다. –