ОБНОВЛЕНИЕ
Исходный тестовый код, приведенный ниже, в значительной степени корректен, но в NodeJS различные службы AWS должны быть настроены немного по-другому согласно предоставленной ссылке SDK by @ Michael-sqlbot
// manager
const AWS = require("aws-sdk")
const https = require('https');
const agent = new https.Agent({
maxSockets: 498 // workers hit this level; expect plus 1 for the manager instance
});
const lambda = new AWS.Lambda({
apiVersion: '2015-03-31',
region: 'us-east-2', // Initial concurrency burst limit = 500
httpOptions: { // <--- replace the default of 50 (https) by
agent: agent // <--- plugging the modified Agent into the service
}
})
// NOW begin the manager handler code
Планируя новый сервис, я провожу предварительное стресс-тестирование.После прочтения о пределе 1000 одновременных выполнений на учетную запись и начальной скорости пакета (что в us-east-2 равно 500), я ожидал достичь как минимум 500 одновременных пакетовказни сразу.Скриншот ниже лямбда-метрики CloudWatch показывает обратное. Я не могу пройти 51 параллельное выполнение независимо от того, какое сочетание параметров я пытаюсь .Вот тестовый код:
// worker
exports.handler = async (event) => {
// declare sleep promise
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
// return after one second
let nStart = new Date().getTime()
await sleep(1000)
return new Date().getTime() - nStart; // report the exact ms the sleep actually took
};
// manager
exports.handler = async(event) => {
const invokeWorker = async() => {
try {
let lambda = new AWS.Lambda() // NO! DO NOT DO THIS, SEE UPDATE ABOVE
var params = {
FunctionName: "worker-function",
InvocationType: "RequestResponse",
LogType: "None"
};
return await lambda.invoke(params).promise()
}
catch (error) {
console.log(error)
}
};
try {
let nStart = new Date().getTime()
let aPromises = []
// invoke workers
for (var i = 1; i <= 3000; i++) {
aPromises.push(invokeWorker())
}
// record time to complete spawning
let nSpawnMs = new Date().getTime() - nStart
// wait for the workers to ALL return
let aResponses = await Promise.all(aPromises)
// sum all the actual sleep times
const reducer = (accumulator, response) => { return accumulator + parseInt(response.Payload) };
let nTotalWorkMs = aResponses.reduce(reducer, 0)
// show me
let nTotalET = new Date().getTime() - nStart
return {
jobsCount: aResponses.length,
spawnCompletionMs: nSpawnMs,
spawnCompletionPct: `${Math.floor(nSpawnMs / nTotalET * 10000) / 100}%`,
totalElapsedMs: nTotalET,
totalWorkMs: nTotalWorkMs,
parallelRatio: Math.floor(nTotalET / nTotalWorkMs * 1000) / 1000
}
}
catch (error) {
console.log(error)
}
};
Response:
{
"jobsCount": 3000,
"spawnCompletionMs": 1879,
"spawnCompletionPct": "2.91%",
"totalElapsedMs": 64546,
"totalWorkMs": 3004205,
"parallelRatio": 0.021
}
Request ID:
"43f31584-238e-4af9-9c5d-95ccab22ae84"
Достигну ли я другого предела, который я не упомянул?Есть ли недостаток в моем тестовом коде?Я пытался достичь предела здесь с 3000 рабочих, но не произошло никакого регулирования, которое, я думаю, связано с асинхронным повторением вызова.
Редактировать : Естьнет ни одного VPC, задействованного ни в одной лямбде;настройка на выбранном входе «No VPC».
Edit : отображение Cloudwatch до и после исправления