2011-05-14 50 views

Trả lời

15

Tôi không nghĩ rằng bạn có thể buộc khách hàng phát trực tiếp ở tốc độ được xác định trước, tuy nhiên bạn có thể kiểm soát "tốc độ trung bình" của toàn bộ quá trình.

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

Đây là mã giả, nhưng bạn có thể nhận được điểm. Có thể có một cách khác, và tốt hơn, cách mà tôi không biết. Trong trường hợp như vậy, tôi hy vọng người khác sẽ chỉ ra.

Lưu ý rằng nó cũng không chính xác lắm và bạn có thể muốn có một chỉ số khác với tốc độ trung bình.

+1

Đó là một cách tiếp cận rất khéo léo. Tôi sẽ phải xem xét nó. Tôi chắc chắn rằng tôi đang theo đuổi một "ý tưởng không tốt" nhưng tôi muốn xem điều gì sẽ xảy ra. – jcolebrand

+2

@drachenstern, ý tưởng này hoàn toàn hợp lệ. Có một số lý do để hạn chế tốc độ tải lên. Ví dụ: bạn có thể muốn cung cấp các gói cao cấp hoặc bạn chỉ có thể muốn giữ những nội dung tải lên đó trên trang web của mình trong một khoảng thời gian lâu hơn (tỷ lệ phiên dịch quảng cáo cao hơn) trong số các lý do khác. Tôi không chắc chắn, nhưng nó cũng có thể lây lan sử dụng tài nguyên đồng đều hơn và do đó cải thiện hiệu suất (nhưng một lần nữa, tôi không hoàn toàn chắc chắn về điều này). – Tom

+0

~ Uh, cái gì? Tôi là người hỏi câu hỏi, đó chính là lý do tôi đang cân nhắc. Tôi có nghĩa là đây là Node, và nó được dự định là nhanh và có thể mở rộng (lên và ra cùng một lúc) để hạn chế tốc độ tải lên có thể không cần thiết. Ngoài ra, tôi không biết rằng tôi có thể giới hạn tốc độ tải lên trong nút. Nó có thể không về cơ bản là một lựa chọn, và làm chậm chấp nhận trên uplaods có thể là cách duy nhất để đi, đó là những gì câu trả lời này cung cấp. – jcolebrand

2

Thay vì tự lăn, cách bình thường để thực hiện điều này trong sản xuất là cho phép trình cân bằng tải hoặc máy chủ nhập của bạn điều chỉnh các yêu cầu gửi đến. Xem http://en.wikipedia.org/wiki/Bandwidth_throttling. Nó không phải thường là một cái gì đó một ứng dụng cần phải xử lý chính nó.

+0

Điểm tốt. Nhưng tôi đã tìm ra điều này sẽ là máy chủ nhập cảnh, vì vậy ... – jcolebrand

6

Sử dụng throttle mô-đun để kiểm soát các đường ống dòng tốc độ

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

Hoạt động thực sự tốt! –

Các vấn đề liên quan