Node.js在AWS Lambda中具有内置的速率限制功能,可以使用以下示例来控制请求速率:
const rateLimit = require("lambda-rate-limiter");
exports.handler = rateLimit({
interval: { minutes: 1 },
uniqueTokenPerInterval: 1000, // limit each IP to 1000 request per minute
redisConfig: { host: "redis", port: 6379 }, // Redis configuration, if you don't have a Redis instance running on same network as Lambda function, use rejson extension instead.
errorMessage: "Too many request, please try again later.",
keyGenerator: function (event) {
return event.headers["X-Forwarded-For"].split(",")[0];
},
onRateLimited: function (error, rateInfo) {
console.log(`Rate limit error: ${error}`);
console.log(`Rate limited request: ${rateInfo}`);
},
}, function (event, context, callback) {
// Your normal Lambda function code here
});
此示例使用lambda-rate-limiter包和Redis作为存储介质,每分钟限制每个IP地址的请求次数为1000次。如果达到限制,将返回定义的错误消息。当请求被限制时,会执行onRateLimited回调函数。此处的keyGenerator使用X-Forwarded-For头部中的值作为IP地址。
要使用其他存储介质,例如DynamoDB或S3存储桶,请查看相关文档。