2012-02-03 4 views
8

이중 비동기 호출의 성능 이점을 부정 할 수는 없지만 몇 가지 사항에 대해서는주의해야합니다.WCF 이중 클라이언트를위한 모범 사례

클라이언트 개체가 인스턴스화되면 WCF는 특정 클라이언트 서비스 인스턴스가 콜백 인수를 수신하는지 여부를 알 수 있습니까?

누구에게 말해도 될까요? 왜 안되면?

new DuplexChannelFactory<IServerWithCallback>(
    new ClientService(), 
    new NetTcpBinding(), 
    new EndpointAddress("net.tcp://localhost:1234/"+Guid.NewGuid())) 
가 폐기 될 수 있는지 상기 가상 경로가 확보되면
  1. . 나는 클라이언트 서비스 수명이 상당히 짧기를 원한다. 인터넷 익스플로러 (IE)는 요청을하고 응답을받으며 수신을 마쳤을 때 그것을 죽인다. 풀링하고 오래 유지하는 것과 달리 클라이언트 서비스 수명을 짧게 만드는 데 성능 저하가 얼마나 심합니다.

    아이디어는 시간 초과 문제를 피하는 것입니다. 처리가 완료되면 최대한 빨리 처리하십시오. 관습에 따라 - 클라이언트 서비스를 전달할 수 없습니다. 정보가 필요하면 간단한 EF/L2S 등의 새로운 정보를 만드십시오.

  2. WCF 서비스 자체에서 클라이언트와의 세션을 어떻게 종료합니까? 즉. 나는 클라이언트가 세션을 끝내기를 원하지 않는다. 나는 적절하게 내 작업을 꾸밀 수 있지만, 특정 조건이 충족 될 때 서비스가 프로그래밍 방식으로 종료되기를 원한다.

  3. 나는 방화벽 문제를 해결하기 위해 포트와 포워드를 붙일 수 있지만 클라이언트가로드 밸런서 뒤에 앉아 있으면 걱정할 것입니다. 서비스가 어떤 특정 서버를 호출하는지 어떻게 알 수 있습니까?

답변

7

결국 듀플렉스 서비스는 Microsoft의 또 다른 실패 아키텍처입니다. 이것은 종이에서 정말 좋게 보였지만 더 자세히 조사 할 때마다 떨어져 버리는 것 중 하나입니다. 서버에서 클라이언트 리스너를 설정하는 세션에

1) 신뢰 :

너무 많은 약점이있다.세션 정보가 메모리에 저장됩니다. 따라서 서버 자체의로드 균형을 조정할 수 없습니다. 또는로드 밸런싱을 사용하면 ip affinity를 켜야합니다. 그러나 서버 중 하나가 포격되면 단순히 다른 서버를 추가하고 이러한 모든 세션이 새 서버로 자동 마이그레이션되도록 기대할 수 없습니다.

2) 라우터/방화벽 /로드 밸런서 뒤에있는 각 클라이언트에 대해 특정 포트가있는 새 끝점을 만들어야합니다. 그렇지 않으면 라우터가 콜백 메시지를 해당 클라이언트로 올바르게 라우트 할 수 없습니다. 또 다른 방법은 특정 경로를 특정 서버로 리디렉션하는 사용자 지정 프로그래밍을 허용하는 라우터를 사용하는 것입니다. 다시 큰 주문. 또는 콜백을 사용하는 클라이언트가 자체 데이터베이스를 호스팅하고 데이터베이스를 통해 데이터를 공유하는 방법이 있습니다. < - 라이선스 비용이 문제가되지 않는 상황에서도 작동 할 수 있지만 복잡하고 많은 부담이 따르는 경우가 있습니다. 클라이언트와 응용 프로그램과 서비스 레이어를 함께 사용합니다 (약간의 예외적 인 경우에는 허용되지만 엄청난 설정 ​​비용의 상단에는 허용되지 않을 수 있음).

3)이 모든 것은 기본적으로 양면 인쇄가 실제로 쓸모 없다고 말합니다. 콜백이 필요하다면 클라이언트 측에서 wcf 호스트를 설정하는 것이 좋습니다. 더 간단하고 훨씬 확장 성이 있습니다. 또한 클라이언트와 서버 간의 결합이 적습니다.

확장 가능한 아키텍처를위한 최상의 이중 솔루션은 결국 하나를 사용하지 않습니다.

+2

이 답변은 NetTcpBinding 또는 이중 Http 바인딩에 해당됩니까? – Yaniv

3
  1. 그것은 당신이 클라이언트가 new'd 그들이 마지막으로 얼마나 오래해야하는지 짧은에 따라 달라집니다. 매번 새로운 클라이언트가 필요하다면 풀링은 옵션이 아니지만, 클라이언트가 동일한 클라이언트를 계속 사용하는 이유는 무엇입니까?

  2. 실제로 서비스가 클라이언트에 다시 호출 (클라이언트에서 실제로 함수를 호출)하여 정보를 전달하는 경우 서비스는 이제 클라이언트이고 그 반대의 경우도 마찬가지입니다. 콜백을 만드는 서비스를 가질 수 있습니다. 연결을 닫지 만 GC가 처리 할 수있을 때까지 열려 있습니다. 경험보다 오래 걸릴 수 있습니다. 즉, 클라이언트 자체가 종료되거나 연결이 끊어지면 클라이언트가 응답해야하거나 클라이언트에서 데이터를 가져와야하는 클라이언트 (클라이언트가 무언가를 호출하는 클라이언트 임)이어야합니다.

  3. 이중 콜백에서 이제 클라이언트에 다시 호출되는 서비스는 duplexchannelfactory 뒤에 추상화 된 클라이언트의 주소를 가져옵니다. 서비스가 클라이언트에게 콜백 할 수 없다면 할 수있는 일이 많지 않다고 생각합니다. 클라이언트가 서비스에 호출하는 포트가 열려 있어야 콜백을받을 수 있습니다.