2012-04-03 2 views
3

듀플렉스 서비스를 중단해야하며 대규모 전송을 하나의 서비스로 캡슐화하고 다른 서비스에서 가져 오려고합니다. 이전에는 하나의 서비스에서이 모든 것을 사용했지만 크기/메모리 조정을 위해 버퍼링에서 스트리밍으로 전환해야합니다. 몇 가지 질문이 있습니다. herehere하지만 꽤 오래된 것입니다.서비스간에 데이터 공유

namedPipe는 서비스간에 IPC로 무엇을 사용합니까?

서비스 및 A 내가 서비스 B로 유지하고 싶은

이제

이 잘 작동하고,이 방법 Guid Upload(stream), Stream Download(Guid)를 노출하고 net.tcp 스트리밍을 사용? 이것이 명명 된 파이프 WCF일까요?

서비스 C -> 비즈니스 레이어 ->서비스 BGuid와 함께

내 질문/서비스 B 지속성을 위해 사용하는 것입니다, 검색 및 B에 다시 항목을 계산 지속 할 고객의 관점에서

  1. 클라이언트 ServiceA_Proxy.Upload(someLargeItem) 수익을 호출 Guid
  2. 클라이언트는 ServiceC_Proxy.DoSomeWork(GuidFromCall_1)
  3. 클라이언트는 다음 최종 사용자에 ServiceA_Proxy.Download(GuidFromCall_1)
  4. 클라이언트 디스플레이를 호출 통화

답변

0

예는에서 실행되는 comunicating 프로세스만큼바인딩 WCF로 명명 된 파이프를 사용할 수 있습니다 같은 서버. 기본적으로 TCP/IP와 같은 다른 바인딩을 사용하는 것처럼 WCF 서비스를 만들지 만 끝점netNamedPipeBinding을 사용하도록 구성해야합니다.

데이터를 유지/저장하려면 요구 사항에 따라 데이터를 파일 또는 데이터베이스에 저장할 수 있습니다. ServiceC가 호출하기 전까지 데이터를 보관하기 만하면 Dictionary<Guid, SomeLargeItem>이면 충분합니다. 같은

그래서 당신의 흐름이 보일 것이다 : 클라이언트 GUID를 ServiceA_Proxy.Upload (someLargeItem)를 호출 반환

  1. ServiceA는 ServiceB_Proxy.Upload (GuidFromCall_1, someLargeItem)는
  2. 클라이언트는 다음 ServiceC_Proxy.DoSomeWork을 (호출 호출 GuidFromCall_1) (먼저 업로드가 완료되었는지 확인해야합니다.)
  3. ServiceC 호출 ServiceB_Proxy.Download (GuidFromCall_1)
  4. ServiceC는 DoSomeWork uidFromCall_1) (내부적으로)
  5. ServiceC 호출 ServiceB_Proxy.Upload (GuidFromCall_1, someLargeItemProcessed)
  6. 클라이언트는 ServiceA_Proxy를 호출합니다.다운로드 (GuidFromCall_1) (다시 처리가 완료되었는지 확인해야 함)
  7. ServiceA가 ServiceB_Proxy.Download (GuidFromCall_1)를 호출하고 클라이언트로 돌아갑니다.
  8. 클라이언트는

은 내가 엉망 뭔가를하지 않았다 확실하지 않다 최종 사용자에 표시됩니다. 보시다시피, 꽤 복잡해지고 있습니다. 이 방법을 사용하면이 방법으로 서비스를 분할하면 실제로 확장 성이 향상됩니다. NamedPipes를 사용하여 모든 처리가 여전히 동일한 시스템에 있도록 할 계획입니다.

정말 디자인을 고려해야합니다. 어쩌면 기능을 일부 * .dll로 분리하여 직접 호출해도 충분할 것입니까? 이렇게하면 레이어를 논리적으로 분리 할 수 ​​있습니다. 버퍼링에서 스트리밍 통신으로 전환 할 때 논리를 더 많은 서비스로 분할 할 필요가 없습니다.

그리고 당신은 사실 확장 성을 원하는 경우, 사용을 고려하고 각 서비스에 대한 별도의 시스템 (예를 MSMQ에 대한).

+0

에는 양방향 파이프와 스트리밍이 필요할 때 "버퍼 된 통신에서 스트리밍 통신으로 전환 할 때 논리를 더 많은 서비스로 분할 할 필요가 없습니다"라는 예가 있습니다. 모든 것이 ServiceC에서 수행되었지만 업로드가 너무 커서 캐시를 버퍼링 할 수 없으므로 중앙 캐시가 갈 길이 란 뜻인 것 같았습니다 – Eric

+0

업로드 한 파일의 크기는 얼마나됩니까? 전송이 끝난 후 문제를 메모리로 전송하는 방식으로 전송합니까? 스트리밍과 듀플렉스를 모두 사용할 수는 없지만이 경우 듀플렉스 대신 요청 재생을 사용하도록 솔루션을 다시 설계해야합니다. – surfen

+0

500MB - 업/다운을위한 2GB. 하나의 서비스 였을 때, 업로드 청크에 대한 콜백을 사용하여 처리하고 완료했으며 나중에 Dictionary 를 사용하여 검색했습니다. 우리가 계약했을 때이 크기는 고려되지 않았으므로 100MB보다 큰 테스트를 거쳤으므로 이제 OOM 예외가 발생합니다. 빠른 수정을 찾고 있었지만 이것이 매우 일루스러운 일이되었습니다. – Eric