2014-05-10 2 views
0

2 엔드 포인트와 REST API를 감안할 때 :REST API에서 콜백이 필요한 이유는 무엇입니까?

http://example.com/api/send?id=someId

클라이언트 측 :

이 엔드 포인트에 대한 호출 코드에 asynchrnously 이루어집니다.

서버 측 :

요청을 수신 할 때, 몇 asynchrnous 작업이 시작됩니다. 서버는 await 키워드를 사용하여 이러한 비동기 작업의 결과를 기다리고 있습니다. 마침내 결과를 반환합니다.

이 엔드 포인트에 대한 호출 코드에 asynchrnously 이루어집니다 : 클라이언트 측 http://example.com/api/sendAsync?id=someId&callbackUrl=http://something.com/done


.

서버 측 :

요청을 수신 할 때, 몇 asynchrnous 작업이 시작됩니다. 서버는 즉시 ID를 가진 결과를 반환하여 작업을 식별합니다. 결과를 사용할 수있을 때마다 서버는 결과 및 ID를 사용하여 callbackUrl을 호출합니다.

두 번째 방법이 필요한 이유는 무엇입니까?

제게는 첫 번째 접근 방식이 좋을 것 같습니다. 서버가 await 키워드를 사용하여 결과를 기다리면 키워드 이후의 모든 항목이 연속으로 등록되므로 차단하지 않습니다. 또한 클라이언트 측은 비동기 웹 요청이므로 비 차단입니다.

두 번째 방법은 매우 오래 걸리는 요청 (+ 5 분)이라면 유용 할 수 있다는 것을 알고 있습니다. - 그러나, 나는 뭔가를 놓치고있는 것처럼 느낄 수 없습니다. 나는 더 두개의 용도를 볼 수 있습니다

답변

1

글쎄, 첫 번째 접근 방식은 서버 측에서 수평 확장 할 필요가없는 small(er) operations의 경우 괜찮습니다. 매우 거친 예는 다음과 같이 될 것이다 :

public Response SomeApiMethod(int a, int b) 
{ 
    return a + b; 
} 

이 분명히 내가 첫 번째 접근 방식에 둘 것 또한 매우 잘 확장 할 수없는 뭔가 아주 기본적인 작업입니다.

다른 한편으로는 을 수행해야하는 거대한 DB와 같은 기능을 제공한다면 간단히 영원히 걸릴 수 있습니다. Callback approach으로 더 편합니다. 복잡한 작업은 서버에서 다르게 처리 할 수있는 훨씬 간단한 작업보다 많은 오류를 발생시키는 경향이 있습니다. 콜백 프로세스의 일부인 트랜잭션에서 문제가 발생하는 것처럼 서버는 전체 프로세스를 다시 시작하고 결과에 대해 사용자에게 알릴 수 있습니다. 내가 두 번째 접근 방식에 대해 언급 할

뭔가 :

나는 당신이 당신의 API에 대한 ASP.NET을 사용한다고 가정하고, 나는 훨씬 더 ASP.NET 전문가에 의해 해요 그러나 나는 확신 당신이 조만간 응답이 recycled이 될 것이므로 이미 응답을 반환 한 요청 내에서 장기 실행 Task을 실행할 수 없습니다.

그러나 할 수있는 일은 MessageQueue (예 : MSMQ, RabbitMQ ...)을 사용하는 것입니다. 그러면 작업에 대한 메시지가 수신되어 유연한 클라이언트에서 쉽게 처리 할 수 ​​있습니다. 더 많은 사용자를 처리하기 위해 API를 확장해야한다면 Queue의 새로운 메시지를 수신하는 클라이언트를 추가로 던지면 기본적으로 완료됩니다.

+0

답해 주셔서 감사합니다 :-) - API는 전역이며 따라서 재활용되지 않는'MessageQueue' (액터 모델)을 사용합니다. - 따라서 짧은 두 번째 접근법은 완료하는 데 오랜 시간이 걸릴 수있는 작업에만 관련이 있습니다. – ebb

+0

예, 다른 것은 과도하고 클라이언트 측에서 사용하기가 더 어렵습니다. API를 잠재적 인 사용자로 생각하면 요청을하고 즉시 알 수있는 모든 것을 포함하여 응답을받을 수 있다면 훨씬 쉽습니다. 요청을 받으면 콜백을 할 때까지 API 결과에 실제로 의존한다면 자신의 논리를 계속하기 전에 몇 초 (또는 그 이상) 기다려야 할 것입니다. 따라서 코드 작성 및 유지 관리가 훨씬 더 어려워 질 수 있습니다. –

1

:

1) .NET 클라이언트가 쉽게 결제 시스템 API의 다른 URL에 콜백 (관행)

를 처리 할) 두 번째 방법

2를 사용할 수있는 비

관련 문제