2011-09-01 3 views
0

클라이언트가 우리 서버에 다른 외부 서버로부터 정보를 요청하는 기존 API가 있습니다. 외부 서버가 오랜 시간 (예를 들어 10 초)이 걸리면, Rails는 10 초 동안 Rails 인스턴스를 유지합니다.delayed_job에 레일 연결을 전달하는 방법

우리가 Rails 인스턴스를 비울 수 있도록 delayed_job에 대한 응답을 렌더링 할 수있는 방법이 있습니까?

참고 : 이상적으로는 API를 업데이트하고 Google의 API 클라이언트에 응답하고 잠시 후에 다시 시도하여 준비가되었는지 확인할 수 있습니다. 그러나 이미 수천 명의 고객이 있으며 현재 변경하는 것은 불가능합니다.

답변

2

이것을 처리하는 일반적인 방법은 작업을 대기열에 넣고 즉시 반환 한 다음 Pusher 또는 Faye와 같은 비동기 알림 프레임 워크를 사용하여 폴링하거나 원격 클라이언트를 업데이트하는 것입니다. 당신이 설명하는대로 확실히 DJ와의 연결을 통과 할 수는 없습니다. 조사 할 또 다른 방법은 EventMachine을 사용하여 처리하는 것입니다 (l http://railstips.org/blog/archives/2011/05/04/eventmachine-and-passenger/). 세 번째 대안은 원격 웹 서비스에서 데이터를 미리 캐시하는 것이지만, 이는 사용자가 수행하는 작업에 매우 의존하는 방법입니다 (예 : 승인은 사용자가 할 수있는 일이 아닙니다).

기본 바닥 라인은 당신이 약간의 아키텍처 문제를 다루고 있다는 것입니다. 원격 서비스에 대해 말하고 요청주기에 결과를 출력해야하는 경우 EventMachine 또는 Node.js와 같이 이벤트가 많은 백엔드로 변경하기에는 그다지 많은 작업을 수행 할 수 없습니다.

+0

그런데 당신이 요구하는 바를 할 수없는 기술적 인 이유는 DJ 작업자가 다른 프로세스에서 실행된다는 것입니다 (그렇지 않으면 현재 처리중인 요청을 차단할 것입니다). 그리고 프로세스 경계에서 연결을 공유 할 수 없습니다. – karmajunkie

+0

도움을 주셔서 감사합니다. 그냥 궁금해서. 누가 당신이 "프로세스 경계를 ​​넘어서 연결을 공유 할 수 없다"고 말합니까? 리눅스? NGINX? 승객? 고문? 다른? –

+0

나는 그것의 OS 수준 일을 말할 것 같아요. 대부분의 OS에서는 프로세스가 액세스 할 수있는 모든 메모리를 포함합니다. 공유 메모리 공간으로 무엇을 할 수 있는지 알아 보는 것은 흥미로울 수도 있지만, 나는 TBH라는 알고있는 OS 수준의 괴짜로는 충분하지 않습니다. – karmajunkie

관련 문제