2013-05-29 2 views
0

Node.js에서 서비스를 작성하는 고전적인 비동기/동시성 문제가 발생합니다. 요청에 대한 응답으로 RDBM에서 일부 데이터를 가져 오는 개체가 있고 행 반입이 완료 될 때 EventEmitter을 사용하여 fin 이벤트를 내 보냅니다.Node.js 요청 직렬화에 대한 가장 간단한 접근법

예상 한대로 서비스 호출자가 여러 개의 거의 동시 호출을하면 예측할 수없는 순서로 행이 반환됩니다. fin 이벤트는 호출 함수에서 발생한 요청에 대한 이해와 일치하지 않는 행에 대해 발생합니다.

var mdl = require('model.js'); 

dispatchGet: function(req, res, sec, params) { 
    var guid = umc.genGUID(36); 

    mdl.init(this.modelMap[sec], guid); 

    // mdl.load() creates returns a 'new events.EventEmitter()' 

    mdl.load(...).once('fin', 
     function() { 
     res.write(...); 

     res.end(); 
     }); 

} 

간단한 테스트는 mdl.guid 자주 guid에 해당하지 않음을 보여줍니다

는 여기에 내가 (관련성 간체) 일어나고있어 한 내용입니다.

함수 내에서 new events.EventEmitter()을 만들면 모든 요청에 ​​대해 이산 EventEmitter을 생성하여이 문제를 해결할 수 있다고 생각했지만 분명하지는 않습니다. new에 관계없이 다른 개체와 마찬가지로 개체 지속성의 동일한 규칙이 적용되는 것으로 가정합니다.

저는 백그라운드에서 C 프로그래머입니다. 순환 큐 또는 해싱 스키마를 사용하여 이러한 응답을 요청과 연결할 수있는 자체 스키마를 만들 수 있습니다. 그러나 나는이 문제가 이미 여러 번 해결되었다고 생각합니다. 내 연구 결과를 가장 잘 처리 할 수있는 방법에 대한 많은 의견이있었습니다. 다양한 종류의 대기열 구현 인 Futures 등이 있습니다.

좋은 비동기식 흐름 제어는 무엇입니까? 내가 의존 할 필요가 없다면 일부 종속성의 거대한 패러다임 전환에 무릎을 꿇고 싶지 않을 것입니다. 제 3 자 모듈이 가장 적합한 상대적으로 단순하고, 표준적이고, 확실한 해결책 및/또는 광범위한 합의가 있습니까?

답변

2

model.js이 이와 비슷한 모양 일 수 있습니까?

module.exports = { 
    init : function(model, guid) { 
    this.guid = guid; 
    ... 
    } 
}; 

당신은 당신이 module.exports에 전달하는 객체가 require("model.js")를 실행하는 다른 모든 모듈이 동일한 개체에 대한 참조 을받을 수 있다는 점에서, 공유 객체가 있다는 것을 알고 있어야합니다.

그래서 당신이 mdl.init() 실행할 때마다, 그 객체의 guid 속성은 "... 간단한 테스트가 mdl.guid 종종 GUID에 해당하지 않음을 보여준다"고 의견을 설명 할 수있는 변경됩니다.

은 정말 당신의 정확한 구현에 따라 달라집니다,하지만 난 당신이 대신 클래스를 사용하고자하는 거라고 생각 :

// model.js 
var Mdl = function(model, guid) { 
    this.guid = guid; 
}; 

Mdl.prototype.load = function() { 
    // instantiate and return a new EventEmitter. 
}; 

module.exports = Mdl; 

// app.js 
var Mdl = require('model.js'); 
... 
var mdl = new Mdl(this.modelMap[sec], guid); 
mdl.load(...) 
+0

아! JavaScript OO 구문과 노드 내부 관계를 이해하지 못하는 것 같습니다. 고맙습니다! –