Оптимизация Node.js HTTP-запрос GET для AWS лямбда


У меня есть следующие Node.JS (во время выполнения В6.10) выполнение в AWS лямбда:

exports.handler = (event, context) => {
    send(event);
};

var flota = ['CZWF64', 'DRZY65', 'DRZY66', 'FPBS85', 'FPBS86', 'FPBS87'];

function send(json) {

    var ppu = json.vehiculo.patente.replace(/[^a-z0-9]/gi, '');

    if (flota.indexOf(ppu) == -1) {
        return;
    } 

    var request = require('request');
    var url = 'http://endpointUrl';

    var gps = json.gps;
    var date = new Date(gps.fecha);

    var month = date.getMonth() + 1;
    var day = date.getDate();
    var hour = date.getHours();
    var min = date.getMinutes();

    var month = (month < 10 ? "0" : "") + month;
    var day = (day < 10 ? "0" : "") + day;
    var hour = (hour < 10 ? "0" : "") + hour;
    var min = (min < 10 ? "0" : "") + min;


    var propertiesObject = {
        aplicacion: 1802, // ID Waypoint
        imei: ppu,
        lat: gps.lat,
        lon: gps.lon,
        alt: gps.alt,
        vel: gps.speed,
        rumbo: gps.cog,
        fecha: date.getFullYear() + month + day,
        hora: hour + min
    };

    request({
        url: url,
        qs: propertiesObject
    }, function(err, response, body) {
        var success = false;
        var error;
        if (response.statusCode != 200) {
            error = new Error('Get response: ' + response.statusCode);
        } else if (err) {
                        error = new Error('[ERROR]: ' + err);
        } else if (( body.indexOf('IMEI') != -1 &&  body.indexOf('registrada') != -1) ||  body.indexOf('ERROR') != -1) {
                        error = new Error('[ERROR]: ' + body);
        } else if ('OK'.localeCompare(body) == 0) {
            success = true;
        } else {
                       error = new Error('[ERROR]: ' + body);
        }
        if (!success) {
            throw error;
        }
    });

}

И как AWS лямбда сборы это затраты на время выполнения, я хочу улучшить приведенный выше код максимально быстрый срок исполнения.

Любые советы будут оценены.

ЗЫ: есть реальный путь к профилю Node.JS в AWS Lambda для того чтобы проверить возможные недостатки?

Первый подход:

Этот код уже не нужен, как это было оглашено в AWS IoT в условие правила, которые вызывает функцию лямбда, тем меньше вызовов сделали.

var ppu = json.vehiculo.patente.replace(/[^a-z0-9]/gi, '');

if (flota.indexOf(ppu) == -1) {
    return;
} 

Второе улучшение

Двигаться константы функции:

var request = require('request');
var url = 'http://endpointUrl';

Третий подход:

Изменить, если/иначе если того, как код HTTP 200 следует прикрыть большинстве случаев:

if (response.statusCode == 200) {
   if ('OK'.localeCompare(body) == 0) {
       success = true;
   } else if (err) {
       error = new Error('[Response ERROR]: ' + err);
   } else if ((body.indexOf('IMEI') != -1 && body.indexOf('registrada') != -1) || body.indexOf('ERROR') != -1) {
       error = new Error('[ERROR]: ' + body);
   } else {
       error = new Error('[Unknown ERROR]: ' + body);
   }
} else {
   error = new Error('HTTP response: ' + response.statusCode);
}


Комментарии
3 ответа


Есть реальный путь к профилю Node.JS в AWS Lambda для того чтобы проверить возможные недостатки?

Узел лямбды-просто небольшой узел модулей. Профилирования это не должно быть иным, чем любой другой узел приложения. Все, что вам нужно, это "фантик" приложение, которое импортирует лямда сценария и звонки handler с поддельным event и context.

Ваш самый большой враг здесь не будет ваш код. Вы можете сделать это только с вашего скрипта на самом деле. Единственное узкое место я вижу, что сетевой запрос и внешней зависимости. Просто убедитесь, что конечная точка реагирует быстро.

Вместо использования request модуль можно использовать встроенный url.format() и http.get чтобы построить свой URL-адрес и сделать запрос GET, соответственно. Это позволит устранить вашу зависимость, осуществление которых у вас нет контроля, и, вероятно, использует как встроенные модули в любом случае.

Также, если у вас есть контроль над этой конечной точки, его ответ нуждается в ремонте. А 200 всегда должна быть успешной. Там не должно быть 200 что несет в себе ошибку. Общие ошибки включают 500 (общая ошибка сервера), 400 (неправильный ввод), 401 или 403 (авт ошибок). После правильных заголовков, это позволит вам пропустить все условные и пусть коды состояния объясниться. Дополнительный текст может быть добавлен, чтобы объяснить код состояния.

1
ответ дан 8 марта 2018 в 01:03 Источник Поделиться

Ваш код выглядит очень чистой. Я не уверен, что есть гораздо улучшить, особенно после третьего улучшения. Похоже, вы ищете миллисекунды, улучшение суб-миллисекунды. Одной из областей усовершенствования будет переключиться на компилируемом языке, чтобы быть более производительным.

Проверьте последний производительности статистика по языку для AWS лямбда.

1
ответ дан 11 марта 2018 в 12:03 Источник Поделиться

ммм.. просто предположение... (я новичок в JS)

Вместо этого..

var date = new Date(gps.fecha);
var month = date.getMonth() + 1;
var day = date.getDate();
var hour = date.getHours();
var min = date.getMinutes();

var month = (month < 10 ? "0" : "") + month;
var day = (day < 10 ? "0" : "") + day;
var hour = (hour < 10 ? "0" : "") + hour;
var min = (min < 10 ? "0" : "") + min;

Как насчет использования Moment.js ? :|

0
ответ дан 8 марта 2018 в 05:03 Источник Поделиться