2013-03-20 2 views
0

우리는 RPC 기능이 필요한 프로젝트에서 NodeJs DNode (https://github.com/substack/dnode)를 사용하려고합니다. 설치 및 테스트되었으며 프로젝트에 적합합니다.DNode 서버 메소드 시간 초과

하나의 작은 문제. 원격 함수는 사용자가 정의 할 수 있으므로 논리를 제어 할 수 없습니다. 즉, 함수를 잘못 작성하고 실행하기 위해 과도한 시간이 걸리거나 심지어는 완료되지 않을 수도 있습니다 (순환 루프).

그래서 질문이 : 생성 된 서버 연결/호출에 제한 시간 체크/이벤트/트리거를 구현하는 방법이 있습니까?
예 : 함수가 5 초의 실행 시간을 초과하는 경우 함수를 중단하고 예외 정보를 클라이언트에 반환합니다.

참고 : 클라이언트에 시간 초과 논리를 구현 했으므로 문제가되지 않습니다. 아무런 이유없이 허위의 좀비 프로세스가 서버 구성 요소를 막히게하지 마십시오.

는 편집 : *이 - 코드 예제 추가 -가 *
서버 (포트 8000에서 수신 대기를 callMe는() 기능은 결코 끝이없는, doWork()를 호출합니다.)

var dnode = require('dnode'); 

function doWork(cltId) { 
    console.log('Client:' + cltId); 
    setTimeout(function() { doWork(cltId); }, 5000); 
} 

var server = dnode({ 
    callMe: function (cltId, cb) { 
     doWork(cltId); 
    } 
}); 
server.listen(8000); 

클라이언트 (결코 반환하지 않는 포트 8000 및 rpc callMe()에 연결)

var dnode = require('dnode'); 
var net = require('net'); 

var d = dnode(); 
d.on('remote', function (remote) { 
    var cltId = 'c-' + Math.random().toString(16).slice(2); 
    remote.callMe(cltId , function (s) { 
     console.log('Result=' + n); 
     d.end(); 
    }); 
}); 

var conn = net.connect(8000); 
conn.pipe(d).pipe(conn); 

클라이언트가 실행되면 중단되지만 종료되거나 연결을 종료하는 시간 초과 설정이 될 수 있습니다. 그래서 클라이언트는 다른 일을 계속할 수 있습니다.

하지만

서버는 여전히 명랑하게 멀리 코드의 우리의 끝없는 조각 펀트됩니다 ...
그리고 더 많은 클라이언트 연결하고 우리가 결국 때까지 추가 가짜 좀비로 끝날 다지 코드를 호출 등 나는 모든 서버 자원이 소비되었다고 생각한다.

답변

2

나는 dnode가하는 일에 대해 혼란스러워한다고 생각합니다. dnode와 함께 사용하는 함수는 정의 된 측면에서만 실행됩니다. 콜백이 직렬화되어 연결의 다른 쪽에서 실행되는 것처럼 보일 수도 있지만 그렇지 않습니다. 클라이언트는 while (true)가 아닌 서버에 중단됩니다,

var d = dnode({ 
    callMe: function() { while (true) } 
}); 
d.pipe(stream).pipe(d); 

및 서버는 callMe() 호출

예를 들어 클라이언트가 않는 경우.

+0

그래를, 그것을 못하고. 내 이해 클라이언트가 호출 할 서버 코드를 정의 할 수 있습니다. 명확한 설명을 돕기 위해 간단한 클라이언트/서버 예제로 내 질문을 업데이트했습니다. – MarkOfSine

0

클라이언트 코드가 할 수있는 :

d.on('remote', function (remote) { 
    var cltId = 'c-' + Math.random().toString(16).slice(2); 
    var t = setTimeout(function() { 
     t = null; 
     console.log("timed out!"); 
     d.end(); 
    }, 5e3); 

    remote.callMe(cltId , function (s) { 
     if(t === null) return; //too late... 
     clearTimeout(t); 
     console.log('Result=' + n); 
     d.end(); 
    }); 
}); 

(안된!)