MSDN Duplex Services

http://msdn.microsoft.com/en-us/library/ms731064.aspx 

 

WCF : Duplex 패턴을 이용한 비동기 호출 구현

http://www.ensimple.net/enSimple/show.aspx?cnum=407&b_id=study_netfr3&page=1

 

InstanceContextMode

서비스 인스턴스가 언제 생성될지를 명시하는 속성으로서, 인스턴스의 생명주기 유형을 결정한다.
InstanceContextMode는 PerCall, PerSession, Single 이렇게 세게의 옵션이 존재한다.
PerCall : 클라이언트가 호출 할 때마다 (새로운) 서비스 인스턴스가 생성되고 호출이 완료될 때, 소멸한다.
호출 마다 새로운 인스턴스가 생성되므로 호출 간에 서비스 인스턴스 내에서(메모리 상에서) 상태 정보를 유지하는 것은 불가하다.
PerSession : 세션(프록시가 생성되고, Close 될 때 까지의 시간) 마다 새로운 서비스 인스턴스가 생성된다. 세션이 종료(Close) 되면 소멸한다. 세션 내에서 일어나는 호출들 간에 서비스 인스턴스 내에서(메모리 상에서) 서로 상태 정보를 공유할 수 있다.
Single : 오직 하나의 서비스 인스턴스 만이 모든 클라이언트로 부터의 호출을 처리한다.
서비스 인스턴스가 소멸되기 전 까지 모든 클라이언트로부터의 모든 호출은 서로 상태 정보를 공유할 수 있다.
** 첨부된 샘플에 간단한 상태 정보 유지에 대한 처리가 포함되어 있다. PerCall, PerSession에 대한 차이를 확인해 보기 바란다.
** 이와 관련해서 아주 훌륭한 글이 있다. 참조 바란다. 유경상 님의 블로그 : http://www.simpleisbest.net/articles/1731.aspx

 

ConcurrecyMode


ConcurrencyMode는 서비스 인스턴스가 멀티스레드로 작동할 것이지 여부를 지정하는 속성이다.
Multiple, Single, Reentrance 이렇게 세가지 모드를 지원한다.
Multiple : Multi-threaded 이다. 그래서 여러 호출을 동시에 처리할 수 있다. 그래서 여러 호출이 하나의 상태 정보를 동시에 공유할 수도 있다. 이때 그 상태 정보의 동기화는 개발자의 책임이다.
Single : Single-threaded이다. 한번에 하나의 호출만 처리한다. 서비스 인스턴스가 호출을 처리 중이면, 다른 호출은 이전 호출이 완료될 때까지 대기하게 될 것이다.
Reentrance : Single-threaded이다. 그러나 서비스 인스턴스가 호출 처리 중에 다른 호출이 요청되면 이를 수용할 수 있는 방식이다.
호출 처리 중에 다시 다른 호출을 처리하도록 하는 것이다. 별도의 스레드로 다른 호출을 처리하는 것이 아니라 하나의 스레드 내에서 여러 호출을 처리하는 것이므로 호출 간에 상태정보를 동기화하는 것이 중요할 수 있으며 역시 개발자 책임이다.
이는 서비스 내에서 다른 서비스를 호출하는 경우에 사용하게 되는데,
클라이언트에서 서비스1 호출 ▷서비스1에서 서비스2 호출 ▷서비스2에서 다시 서비스1을 호출(Call back) 과 같은 경우, 서비스 1이 Reentrance가 아니면 Dead lock이 발생하게 될 것이다..-_-

+ Recent posts