2011-05-14 8 views
10

मैं node.js में सर्वर से अपलोड की गति को कैसे सीमित करूं?मैं node.js में सर्वर से अपलोड की गति को कैसे सीमित करूं?

क्या यह भी एक विकल्प है?

परिदृश्य: मैं कुछ तरीकों को लिख रहा हूं ताकि उपयोगकर्ताओं को स्वचालित रूप से मेरे सर्वर पर फ़ाइलों को अपलोड करने की अनुमति मिल सके। मैं अपलोड की गति को (उदाहरण के लिए) 50kb/s (निश्चित रूप से कॉन्फ़िगर करने योग्य) तक सीमित करना चाहता हूं।

उत्तर

15

मुझे नहीं लगता कि आप एक पूर्व निर्धारित गति पर स्ट्रीम करने के लिए क्लाइंट को मजबूर कर सकते हैं, हालांकि आप पूरी प्रक्रिया की "औसत गति" को नियंत्रित कर सकते हैं।

var startTime = Date.now(), 
    totalBytes = ..., //NOTE: you need the client to give you the total amount of incoming bytes 
    curBytes = 0; 

stream.on('data', function(chunk) { //NOTE: chunk is expected to be a buffer, if string look for different ways to get bytes written 
    curBytes += chunk.length; 
    var offsetTime = calcReqDelay(targetUploadSpeed); 
    if (offsetTime > 0) { 
     stream.pause(); 
     setTimeout(offsetTime, stream.resume); 
    } 
}); 

function calcReqDelay(targetUploadSpeed) { //speed in bytes per second 
    var timePassed = Date.now() - startTime; 
    var targetBytes = targetUploadSpeed * timePassed/1000; 
    //calculate how long to wait (return minus in case we actually should be faster) 
    return waitTime; 
} 

यह निश्चित रूप से छद्म कोड है, लेकिन आपको शायद बिंदु मिल जाएगा। एक और बेहतर और तरीका हो सकता है, जिस तरह से मुझे नहीं पता। ऐसे मामले में, मुझे उम्मीद है कि कोई और इसे इंगित करेगा।

ध्यान दें कि यह भी बहुत सटीक नहीं है, और आप औसत गति से अलग मीट्रिक चाहते हैं।

+1

एक बहुत ही सरल तरीका है कि नियंत्रित करने के लिए। मुझे इसे समझना होगा। मुझे यकीन है कि मैं "बहुत अच्छा विचार नहीं" का पीछा कर रहा हूं लेकिन मैं देखना चाहता था कि इसका क्या होगा। – jcolebrand

+2

@drachenstern, विचार पूरी तरह से मान्य है। अपलोड की गति सीमित करने के कई कारण हैं। उदाहरण के लिए, आप प्रीमियम योजनाएं प्रदान कर सकते हैं या आप अन्य कारणों से लंबे समय तक (विज्ञापनों की उच्च व्याख्या दर) के लिए अपनी साइट पर अपलोड करना चाहते हैं। मुझे यकीन नहीं है, लेकिन यह संसाधन उपयोग को और भी समान रूप से फैल सकता है और इस प्रकार प्रदर्शन में सुधार कर सकता है (लेकिन फिर से, मैं इस बारे में पूरी तरह से निश्चित नहीं हूं)। – Tom

+0

~ उह, क्या? मैं वह लड़का हूं जिसने सवाल पूछा, वही कारण थे जिन पर मैं विचार कर रहा था। मेरा मतलब था कि यह नोड है, और इसका उद्देश्य तेज़ और स्केलेबल (एक ही समय में ऊपर और बाहर) होना है ताकि अपलोड की गति सीमित हो सके। इसके अतिरिक्त, मुझे नहीं पता कि मैं नोड में अपलोड की गति को सीमित कर सकता हूं। यह मौलिक रूप से एक विकल्प नहीं हो सकता है, और उपरोक्तों पर देरी स्वीकार करने का एकमात्र तरीका हो सकता है, जो यह उत्तर प्रदान करता है। – jcolebrand

2

अपना खुद का रोल करने के बजाय, उत्पादन में ऐसा करने का सामान्य तरीका है, अपने लोड बैलेंसर या एंट्री सर्वर को आने वाले अनुरोधों को थ्रॉटल करना है। http://en.wikipedia.org/wiki/Bandwidth_throttling देखें। आमतौर पर ऐसा कुछ नहीं होता है जिसे किसी एप्लिकेशन को स्वयं को संभालने की आवश्यकता होती है।

+0

अच्छा बिंदु। लेकिन मुझे लगता था कि यह प्रवेश सर्वर होने वाला था, इसलिए ... – jcolebrand

6

उपयोग throttle मॉड्यूल पाइप धारा गति

npm install throttle

var Throttle = require('throttle'); 

// create a "Throttle" instance that reads at 1 b/s 
var throttle = new Throttle(1); 

req.pipe(throttle).pipe(gzip).pipe(res); 
+0

वास्तव में अच्छा काम करता है! –

संबंधित मुद्दे