2009-04-20 5 views
3

http를 통해 비동기 스트리밍을 수행하는 데 도움이되는 프레임 워크가 필요합니다. 그것은 SOAP WS 또는 somethign처럼 보일 수 있습니다. 내가 올바르게 이름을 붙일 지 모르겠다. 그래서 여기 내가 필요한 것이다.비동기 웹 서비스 스트리밍

ServerA는 http를 통해 원격 ServerB에 요청하려고한다. 요청에 임의의 정보가 포함되어 있습니다. 결과는 동일한 유형의 여러 레코드를 포함하게됩니다. 그 중 일부는 즉시 사용할 수 있으며 다른 일부는 나중에 사용할 수 있습니다. ServerA는 모든 결과를 사용할 수있을 때까지 기다리지 않고 가능한 빨리 결과를 얻고 자합니다. 실제로 ServerB는 다른 데이터 소스를 검색 할 것이며, 그 중 일부는 다른 데이터 소스보다 응답 성이 좋습니다.

나는 3 가지 종류의 해결책을 생각할 수 있습니다. 첫째, ServerA가이 요청의 임의 ID를 생성 SOAP 요청을 즉시 반환됩니다

void ServerB.startSearch(id, request); 

을 수행하고, A는 주기적으로

Result[] ServerB.areThereAnyNewResults(id); 

그래서 ServerA가 조사 새로운 reasults 이물 서버 B를 호출합니다. 나는이 방법을 폴링이라고 부른다. 그것은

ServerA.acceptResults(String id, Result[] newResults); 

및 전화와 같은 다른 솔루션에 ServerA 측에서 수신 서비스를 노출시키는 B. A에서 확립 된 여러 개의 연결을 포함

그래서 서버 B가 ServerA.acceptResults 새로운 결과를 푸시
ServerB.startSearch(id, request, serverAReceivingServiceEndpoindAddress); 

() 새로운 결과를 얻을 수 있습니다. 나는 그것을 추진이라고 부른다. 그것은 A에서 B로 설정된 1 개의 연결과 B에서 A로 설정된 다중 연결을 포함합니다.

또 다른 옵션은 단일 응답 내에서 동일한 http 채널을 통해 결과를 스트리밍하는 것입니다.

A는 HTTP 호출을 수행합니다 (SOAP 일 수 있는지 또는 다른 것이어야할지 모르겠 음). B가 검색을 시작하고 새 결과를 사용할 수있게되면 http 스트림을 통해 전송하고 플러시하므로 사용자 수 있습니다. 즉시 A면에서 사용 가능합니다. 모든 결과를 사용할 수있을 때까지는 HTTP 연결을 닫지 않습니다. 그것은 A에서 B 로의 단 하나의 연결만을 포함하므로, 왜 그것을 사용하는 것이 더 좋을까요? 나는 그것을 스트리밍이라고 부른다. 일부 프록시가 응답 내용을 버퍼링하는 중일 경우 작동하지 않을 수도 있습니다.

내 질문은 나를 위해 대부분의 작업을 수행 할 수있는 솔루션이 있는지입니다. 내가하고 싶은 어떤 측면

Service s = new RemoteAsyncService("http://serverb.com/serviceEndpoint", RemoteAsyncService.STREAMING); 
// or RemoteAsyncService.POLLING, or RemoteAsyncService.PUSHING 
Request r = new Request(...); 
Callback callback = new Callback(){ 
void newResults(Result[] result){...} 
// e should be null if finished correctly 
void requestFinished(RemoteException e){...} 
} 
s.search(request, callback); 

에 호출 등의 코드와 서버 B 측

public ServiceImpl implements Service{ 
    void search(Request r, Callback c){ 
    // perform search, call c.newResult() when new results are available 
    } 
} 

에 그것을 구현하고 나머지는이 제거 될 때 연결을 다시 설정을 포함한 프레임 워크에 의해 처리됩니다, 버퍼링 프록시로 인해 스트리밍을 수행 할 수 없거나 ServerB가 작업을 끝내거나 예외를 throw 할 때 callback.requestFinished()를 호출하면 폴링/푸싱으로 떨어집니다. 또한 표준 방식으로 인증을 처리해야합니다.

그래서, 가능한 경우 교류가 이루어지며 어떻게 스트리밍이 가능한지에 대한 해결책이 있습니까?

그렇지 않은 경우 오픈 소스로 구현하는 것이 유용 할 것이라고 생각하십니까? :)

답변

1

당신이 말하는 것은 COMET 서비스처럼 들립니다.여기 위키 백과 항목을 읽을 수 있습니다

Comet (programming)

자바에서 그런 일을 구현하려고하지만 .NET에서 당신이 WCF 서비스에 대한 이중 계약을 사용하는 방법을 확실하지. 현재 서비스의 스타일로 접근하고 의사 소통하는 방법에 대한 자세한 내용을보실 수 있습니다 :

How to: Access Services with a Duplex Contract

+0

혜성, [부두] 같은 서블릿 컨테이너 [1] 합리적인 지원합니다. 그리고 네, 여기 혜성이 도움이 될 것 같은 소리가납니다. 그리고 반대로 SOAP은 그다지 유용하지 않을 수 있습니다. 오히려 Comet 또는 RESTish 웹 서비스는 더 많은 유연성을 제공합니다. [1] : http://www.mortbay.org/jetty/ – StaxMan

+0

나는 Comet 스타일 통신이 특수한 경우에만 제한 될 것이라고 생각한다. 왜냐하면 처리 기간이 매우 길면 자원을 양끝에서 보류 상태로 대기시킬 수 있기 때문이다. 작업이 시간이 지남에 따라 쌓입니다. SOAP은 기본적으로 동기화 RPC이기 때문에 "서버"에 노출 된 두 개의 SOAP 서비스와 "클라이언트"가 공개하는 응답/콜백 서비스가 필요합니다. 그러면 클라이언트가 응답 호출 URI를 따라 초기 호출을 전달합니다. "서버"에게 콜백 대상을 알려주십시오. WCF 이중 계약이 더 많거나 적음이라고 생각합니다. – Bob77