2011-10-08 13 views
5

के लिए एक साथ डुप्लिकेट अनुरोधों के लिए स्पष्ट रूप से संभालता है तो नोड मेरे लिए बहुत अच्छा काम कर रहा है। मेरे पास एक बहुत ही विशिष्ट सर्वर एप्लिकेशन है जो मूल रूप से एक विशेष CPU-bound प्रक्रिया करने के अनुरोध स्वीकार करता है, और ऐसा करने के लिए यह एक सी प्रोग्राम निष्पादित करता है। बात यह है कि, यदि मेरे पास एकाधिक ग्राहक हैं, तो शायद मुझे एक ही अनुरोध के कई संस्करण मिलेंगे। किसी विशेष तरीके से लॉक के साथ कैश को कार्यान्वित करके, किसी भी तरह से इसे किसी भी तरह से संभालने के लिए यह एक अच्छा अनुकूलन होगा, ताकि अन्य ग्राहक बस उस अनुरोध पर वापस आने का इंतजार कर सकें और इसकी प्रतिक्रिया कॉपी कर सकें।node.js में कैश कैसे बनाया जाए जो सीपीयू-बाउंड ऑपरेशन

लेकिन मैं नोड के लिए नया हूं, इसलिए मुझे नहीं पता कि यह मेरे मूल नोड राउटर-अनुरोध हैंडलर तंत्र में कैसे रगड़ना है। जाहिर है, मैं इसे बुनियादी समवर्ती प्राइमेटिव्स का उपयोग कर भाषा x में कर सकता हूं, लेकिन मुझे पता है कि नोड घटना-उन्मुख है और मुझे लगता है कि यह किसी घटना के तरीके से काफी सुंदर ढंग से किया जा सकता है। विचार?

उत्तर

0

जावास्क्रिप्ट की क्लाइंट-साइड दुनिया में, आप आम तौर पर किसी सरणी में आइटम कैश करते हैं। मैं नोड के लिए भी नया हूं, इसलिए क्षमा करें यदि यह वह उत्तर नहीं है जिसे आप ढूंढ रहे हैं, लेकिन यह एक कोशिश के लायक है।

जब आप सर्वर से शुरू होता है और प्राप्त अनुरोध के आधार पर कुछ प्रकार के विशेष हैश के साथ परिणामों को स्टोर करते हैं तो आप एक खाली सरणी सेट कर सकते हैं। यह एक व्यवहार्य समाधान की तरह लगता है।

उदा।

var http = require('http'); 
var cache = []; 
http.createServer(function (req, res) { 
    var obj; 
    if(!cache[key]) { 
     obj = .... // logic that gets results 
     cache[obj.key] = obj; 
    } else { 
     obj = cache[key]; 
    } 
}).listen(1337, "127.0.0.1"); 
+0

मुझे लगता है कि आप सही रास्ते पर हैं, मेरी मुख्य चिंता मैं जब के लिए सरणी जाँच संगामिति के लिए संभाल करने की जरूरत है कि क्या है कुंजी, और कुंजी पंजीकृत होने पर प्रतिक्रिया वापस आने के लिए प्रतीक्षा करने के लिए कैसे संभालना है, लेकिन मूल्य अभी तक उपलब्ध नहीं है। मुझे वास्तव में जो चाहिए वह कुछ प्रकार की एक समेकन तंत्र है जो मूल्य उपलब्ध होने पर ग्राहकों को जागने के लिए एक कार्यक्रम पंजीकृत करने का एक तरीका है। यह वह हिस्सा है जो मैं वास्तव में – William

+0

पर अटक गया हूं, मुझे लगता है कि मेरे पास कैश हो सकता है जो प्रत्येक कुंजी के लिए एक ईवेंट एमिटर रखता है ताकि आप पंजीकरण कर सकें? तो मुझे सिर्फ concurrency – William

0

आसान peasy .. Node.js ताकि पहले सीपीयू बाध्य अनुरोध वैसे भी सर्वर ब्लॉक कर रहा है .. तो परिणाम memoize, एकल लड़ी है। अनिवार्य रूप से, आपने अनुरोधित कुंजी के साथ एक हैश स्थापित किया है, और सी प्रोग्राम को कॉल करने से पहले, हैश की जांच करें। यदि वहां है, तो इसे वापस कर दें, आपका काम पूरा हो गया है। यदि ऐसा नहीं है, तो सी प्रोग्राम चलाएं, पर वापस आने से पहले अनुरोधित कुंजी पर हैश में परिणामों को चिपकाएं, फिर वापसी करें।

+0

से निपटना होगा हाँ आदमी मैं क्या कैश है, लेकिन समस्या स्थिरता है। मुझे किसी भी संभावित "ऑर्डरिंग" के बारे में सोचना सिखाया गया है, लेकिन मुझे नोड के शेड्यूलिंग को पर्याप्त रूप से समझ में नहीं आता है। क्या आप कह रहे हैं कि सभी परिचालन परमाणु हैं? यानी मुझे थ्रेड ए अनुरोध, थ्रेड ए शुरुआती नौकरी, थ्रेड बी अनुरोध, थ्रेड बी प्रारंभिक नौकरी, थ्रेड ए रिटर्न, अद्यतन कैश, थ्रेड बी रिटर्न, अद्यतन कैश के बारे में चिंता करने की आवश्यकता नहीं है। देखो मेरा मतलब है? – William

+0

कोई धागा नहीं। ठीक है, ठीक है, * 1 * धागा। इसलिए, सभी घटनाएं सहकारी रूप से निर्धारित की जाती हैं। यही कारण है कि आपको ईवेंट हैंडलर के बारे में सावधान रहना चाहिए जो बहुत कुछ करते हैं; जब तक यह वापस आता है, तब तक इसे 'मंजिल' मिल जाता है। तो, अनुरोध ए आता है, अनुरोध ए प्रसंस्करण शुरू होता है, अनुरोध बी आता है, लेकिन ईवेंट लूप वापस नहीं आया है, इसलिए अनुरोध बी के अनुरोधक हैंडल रिटर्न तक सॉकेट की कतार में रहता है। –

3

उपरोक्त कई उत्तरों, लेकिन वास्तव में समान संसाधन के लिए पैराल अनुरोधों का कोई भी इलाज नहीं कर रहा है।

कैश कुंजी की जांच करते समय आपको समवर्तीता के बारे में चिंता करने की आवश्यकता नहीं है, क्योंकि नोड एक एकल थ्रेडेड वातावरण है। आपके सभी कार्य वास्तव में परमाणु हैं। नोड में सभी एसिंक ऑपरेशंस हालांकि इसे और अनुरोध स्वीकार करने का कारण बनेंगे। इस प्रकार आप समवर्ती अतिव्यापी अनुरोधों को हैंडल करने की जरूरत है, यहाँ एक EventEmmiter लिए पर्यवेक्षकों को पंजीकृत करने के साथ हल:

var http = require('http'), EventEmitter = require('events').EventEmitter; 
var cache = {}; 

http.createServer(function (req, res) { 
    var key = someMagic(req), cached = cache[key]; // get some unique request identifier 

    if (!cached) { // if we've never seen this request before 
    cached = new EventEmitter(); // make this cache entry an event emitter 
    cached.status = 'running'; 
    handleAsyncRequest(function(result) { // your request handling is probably asynchronous, call this callback when you're done 
     cached.response = result; // memoize data 
     cached.status = 'finished'; 
     cached.emit('finished'); // notify all observers waiting for this request 
    }); 

    } else { 
    switch(cached.status) { // if existing request, check if it's still running or finished 
     case 'finished': 
     res.end(cached.response); // send cached response immediately if request has finished 
     break; 
     case 'running': 
     // subscribe as observer; send response when request is finished 
     cached.once('finished', function() { res.end(cached.response); }); 
     break; 
    } 
    } 
}).listen(1337, "127.0.0.1"); 
संबंधित मुद्दे