2013-03-20 63 views
0

我們正在尋找在我們需要RPC功能的項目中使用NodeJs DNode(https://github.com/substack/dnode)。 它已經設置和測試,似乎很適合該項目。DNode服務器方法超時

雖然一個小竅門。遠程功能可以由用戶定義,因此我們無法控制邏輯。這意味着該函數可能寫得很糟糕,需要花費過多的時間來執行,甚至可能永遠不會完成(無限循環)。

所以問題:有沒有一種方法來實現產生的服務器連接/調用超時檢查/事件/觸發器。
例如如果該函數超過5秒的執行時間,則中止它並將異常信息返回給客戶端。

注意:我們在客戶端上實現了超時邏輯,所以這不成問題。只是不想讓虛假的殭屍進程無故阻塞服務器組件。

編輯: * - 添加代碼示例 - *
服務器(偵聽端口8000,呼我()函數調用的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 呼我(),它永遠不會返回)

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的功能只能在它們被定義的一面執行。它可能看起來好像回調在連接的另一端被序列化和執行,但它們不是。

舉例來說,如果客戶端執行:

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

和服務器調用callMe(),客戶端將掛在while (true),而不是服務器。

+0

是啊,沒有得到它。我的理解是你已經定義了客戶端會調用的服務器代碼。 我用一個簡單的客戶端/服務器示例更新了我的問題,試圖幫助澄清。 – MarkOfSine 2013-03-21 09:36:42

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(); 
    }); 
}); 

(未經測試!)