Google Cloud Platform - Оптимизируйте облачную функцию с помощью кукловода (Node.js) - PullRequest
1 голос
/ 08 октября 2019

Я написал функцию в node.js, которая хорошо работает, когда я запускаю ее локально (~ 10 секунд до запуска).

Поскольку я хочу запускать ее каждый час, я развернул ее на Google Cloud Platform, Но, там, у меня всегда есть ошибка TimeOut .

Поэтому, у вас есть какие-либо советы по поводу:

  • что я должен изменить в своемфункция, чтобы сделать его более эффективным?
  • альтернативный способ автоматизировать мою функцию, чтобы она выполнялась каждый час?

К вашему сведению, моя облачная функция имеетследующие характеристики:

  • Узел JS 8
  • Память: 2Go
  • Время ожидания: 540 секунд

и следующая форма:

exports.launchSearch = (req, res) => {

const puppeteer = require('puppeteer');
const url = require('./pageInformation').url;
const pageLocation = require('./pageInformation').location;
const userInformation = require('./userInformation').information;

(async () => {
    const browser = await puppeteer.launch({args: ['--no-sandbox']});
    const page = await browser.newPage();
    await page.goto(url);

    // Part 1
    await page.click(pageLocation['...']);
    await page.type(pageLocation['...'], userInformation['...']); 
    await page.waitFor(pageLocation['...']);
    await page.click(pageLocation['...']);
    ... ~20 other "page.click" or "page.select"

    // Part 2
    var continueLoop = true;

    while (continueLoop) {

        var list = await page.$x(pageLocation['...']);

        if (list.length > 0) {
            await list[0].click();
            var found = true;
            var continueLoop = false;
        } else {
            var afficher = await page.$x(pageLocation['...']);
            if (afficher.length > 0) {
                await afficher[0].click();
            } else {
                var continueLoop = false;
                var found = false;
            };
        };
    };

    // Part 3
    if (found) {
        await page.waitForXPath(pageLocation['...']);
        const xxx = await page.$x(pageLocation['...']);
        await xxx[0].click();
        ... 5 other blocks with exact same 3 lines, but with other elements to click
    };

    await browser.close();
})();

};

Я пытался запустить его по частям;иногда это заканчивается в конце части 1, иногда в конце части 2. Но весь сценарий так и не был полностью завершен.

1 Ответ

0 голосов
/ 30 октября 2019

Не имея слишком большого контекста того, что делает ваш код, трудно указать основную причину, но я говорю, что продолжайте отладку вашего кода, как предложено Горацио , или вы можете использовать более сложныйинструмент типа StackDriver для мониторинга производительности ваших облачных функций. Оцените его стоимость , если вы заинтересованы.

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

var start = process.hrtime();
yourfunction();
var elapsed = process.hrtime(start)[1] / 1000000;

console.log("Elapsed:" + elapsed.toFixed(3));

Если у вас есть точный фрагмент кода, который влияет на выполнение, вам, вероятно, придется его оптимизировать. Кроме того, поскольку я понимаю, что локально это работает отлично, учтите, что иногда процессы, работающие в облачной среде, подвержены задержке из-за «близости» других ресурсов, которые они потребляют.

Что касается вашего второго вопроса, об автоматизации вашей функции, которая будет выполняться каждый час. Вы можете воспользоваться Cloud Scheduler . Он имеет возможность совершать запланированные вызовы к конечным точкам HTTP / HTTPS, которые облачные функции классифицируют как одну из них. Обязательно проверьте также цены .

...