Есть ли способ отловить ошибку тайм-аута лямбда AWS на уровне кода? - PullRequest
0 голосов
/ 26 ноября 2018

Есть ли способ отловить ошибку AWS lambda timed out на уровне кода, чтобы у меня была возможность обработать ошибку до выхода из функции lambda?

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Я хотел бы поделиться своим решением здесь:
Допустим, у меня есть функция-обработчик лямбда-выражений, и установленный лимит времени ожидания составляет 15 минут.Внутри этой функции у меня есть асинхронная функция с именем work(), которая может занять больше 15 минут.

Чтобы поймать ошибку тайм-аута от Lambda, я делаю так:
Я создаю новую асинхронную функцию с именем timeout(), и эта функция просто возвращается через 14,9 минут.И я позволяю функциям work() и timeout() запускаться одновременно, если work() может завершиться через 14,9 минут, то work() возвращает раньше, чем timeout(), в противном случае timeout() возвращает раньше.
Выэто легче понять с помощью этой диаграммы:

enter image description here

И это всего лишь race() оператор, который делает из rxjs.

Здеськод, который реализует эту идею с помощью rxjs:

module.exports.customTimeout = async (event) => {
  function work() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('finished!');
      }, 15 * 60 * 1000);
    });
  }
  const workStream = from(work());

  function timeout() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('timeout!');
      }, 14.9 * 60 * 1000);
    });
  }
  const timeoutStream = from(timeout());

  const res = await new Promise((resolve, reject) => {
    race(workStream, timeoutStream)
      .subscribe(msg => {
        resolve(msg);
      })
  });

  return { res };
};
0 голосов
/ 26 ноября 2018

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

Каждый язык имеет функцию, предоставляемую объектом context для полученияоставшееся время в миллисекундах .

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

Например (узел):

function handler(event, context, callback) {
  const timer = setTimeout(() => {
    console.log("oh no i'm going to timeout in 3 seconds!");
    // &c.
  }, context.getRemainingTimeInMillis() - 3 * 1000);
  // rest of code...
  clearTimeout(timer);
  callback(null, result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...