繁体   English   中英

如何测试限速HTTP请求功能?

[英]How to test rate limited HTTP request function?

我有一个外部服务,正在向Node.js发出HTTP请求。 该服务当前有限制,每秒只能发出10个请求。 我写了一个天真的速率限制器,试图进行测试,但是在时间上有所下降。 我知道Javascript时间不是很准确 ,但是我得到的波动千差万别,最长可达50毫秒。

这是我在做什么的要点:

var RATE_LIMIT_MS = 100 // No more than 10 requests per second
var NEXT_WAIT_MS = 0

function goGetRequest(...) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            function complete() {
                // Rollback next time after this request finishes
                NEXT_WAIT_MS = Math.max(0, NEXT_WAIT_MS - RATE_LIMIT_MS)
            }

            // ... requests are fired off here asynchronously...
            http.get(...).then(complete)

        }, NEXT_WAIT_MS)

        // Push time back on the queue
        NEXT_WAIT_MS += RATE_LIMIT_MS
    })
}

var chai = require('chai')
var expect = chai.expect

it('should rate limit requests properly', function() {
    var iterations = [0, 1, 2, 3, 4]
    var lastResponseMs = 0

    var promises = iterations.map(function(i) {
        return goGetRequest(...).
            then(function(result) {
                // Diff the times
                var thisResponseMs = Date.now()
                var thisDiffMs = Math.abs(thisResponseMs - lastResponseMs)

                expect(wrapper.results).to.not.be.empty
                expect(thisDiffMs, 'failed on pass ' + i).to.be.at.least(RATE_LIMIT_MS)

                // Move last response time forward
                lastResponseMs = thisResponseMs
            })
    })

    return Promise.all(promises)
})

接下来发生的是测试将在随机通过时失败。 第2遍的时间差为92毫秒,第4遍的时间差为68毫秒。 谢谢!

Javascript setTimeout和setInterval(与任何非实时代码一样)从来都不是精确的。 但是,如果您使用的是NodeJS,则可以尝试使用Nanotimer:

https://www.npmjs.com/package/nanotimer

var NanoTimer = require('nanotimer');

var timerA = new NanoTimer();

timerA.setTimeout(yourFunction, '', NEXT_WAIT_MS);

另外,我建议您仅测试发生速率限制,而不必过分担心精确度。 如果您连续11次发送垃圾邮件(希望它不超过一秒钟),并且被阻止,一秒钟后就可以了,则可以认为您的测试通过了。

最后一种解决方案是使用exec()并调用OS sleep命令,该命令要精确得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM