Серверный Cron Job стреляет дважды - PullRequest
0 голосов
/ 17 мая 2018

Я не уверен, почему, но мой webhook дважды запускается в моей работе cron.Таким образом, предполагается, что эта задача cron запускается раз в 15 минут, что она делает, но она запускается дважды.Я опубликую журналы, обработчик и файл yml, чтобы выручить.

По сути, моя работа cron будет делать несколько запросов к API-интерфейсу salsify для сохранения URL-адреса внутри mongodb.Когда этот файл будет завершен и собран при следующем запуске задания cron, он должен запустить webhook для netlify.Затем процесс начинается снова и снова.

В моем netlify я заметил, что сборка запускалась дважды, и указатель указывал на источник для задания cron без сервера.


РЕДАКТИРОВАТЬ: Что-то яСледует добавить, что даже если мое задание cron запускается дважды, оно все равно должно технически вызывать webhook только один раз, если в MongoDB есть файл.Тем не менее, он все равно дважды вызывает его, что приводит к сбою моей сборки netlify, потому что для сборки ему нужен этот файл.


функция часть serverless.yml:

functions:
  salsifyCron:
    handler: src/handler.salsifyCron
    events:
      - schedule: 
          rate: cron(*/15 * * * ? *)
          enabled: true

Журналы:

2018-05-17 10:00:41.121 (-05:00)    10d87735-59e3-11e8-be56-69e06899fa1f    Trigger Webhook
2018-05-17 10:01:45.941 (-05:00)    10d87735-59e3-11e8-be56-69e06899fa1f    Trigger Webhook

, обработчик:

require('envdotjs').load();
import fetch from 'isomorphic-fetch';
import axios from 'axios';
import middy from 'middy';
import { jsonBodyParser, httpErrorHandler, cors } from 'middy/middlewares';

import { connectToDatabase } from '../utils/db';
import Sheet from '../models/Sheet';
import config from '../utils/config';

module.exports.salsifyCron = middy(async (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;
  let sheetId;
  const options = {
    url: `https://app.salsify.com/api/orgs/${
      process.env.SALSIFY_ORG_ID
    }/export_runs`,
    headers: {
      Authorization: `Bearer ${process.env.SALSIFY_API_KEY}`,
      'Content-Type': 'application/json'
    }
  };
  await connectToDatabase();

  const storedData = await Sheet.find({});
  if (
    storedData.length > 0 &&
    storedData[0] &&
    storedData[0].status === 'completed' &&
    storedData[0].url !== null
  ) {
    console.log('Trigger WebHook');
    axios.post('https://api.netlify.com/build_hooks/*****************');
    process.exit(0);
    return;
  }
  if (storedData[0]) {
    sheetId = storedData[0].sheetId;
  }
  if (storedData.length === 0) {
    const res = await fetch(options.url, {
      method: 'POST',
      headers: options.headers,
      body: JSON.stringify(config)
    }).then(res => res.json());
    if (res.id && res.status) {
      await Sheet.create({
        sheetId: res.id,
        url: null,
        status: res.status
      });
      sheetId = res.id;
    } else {
      console.log(res);
      process.exit(1);
    }
  }

  const resWithId = await fetch(`${options.url}/${sheetId}`, {
    method: 'GET',
    headers: options.headers
  }).then(res => res.json());

  if (resWithId.status === 'running') {
    console.log('running cron job');
    console.log(resWithId.estimated_time_remaining);
  }
  if (resWithId.status === 'completed') {
    console.log('completed cron job');
    await Sheet.findByIdAndUpdate(
      storedData[0],
      { status: resWithId.status, url: resWithId.url },
      { new: true }
    );
  }
})
  .use(cors())
  .use(jsonBodyParser())
  .use(httpErrorHandler());

1 Ответ

0 голосов
/ 09 января 2019

Лямбда-тайм-аут.Это, возможно, не было проблемой в вашем случае, но это общая проблема, которая вызывает этот результат.

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

Я бы предположил, что ваша лямбда сначала завершается с ошибкой (например, тайм-аут - тайм-аут лямбды по умолчанию довольно мал), и лямбдаповторный запуск после сбоя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...