AWS Лямбда-функция не отправляет сообщение в первый раз, а выполняет каждое последующее сообщение. - PullRequest
1 голос
/ 28 января 2020

У меня есть лямбда-функция, которая запускается через API-шлюз (это работает).

Затем лямбда-код добавляет некоторые данные в DynamoDB (это работает)

Затем я вызываю созданная мной функция, которая отправляет данные в SQS

export const AddToQueue = async vehicleId => {
  const QueueParams = {
    DelaySeconds: process.env.QUEUE_DELAY,
    MessageAttributes: {},
  };

  QueueParams.MessageAttributes.vehicleId = {
    DataType: 'String',
    StringValue: vehicleId,
  };

  QueueParams.QueueUrl = 'my-queue-url';
  QueueParams.MessageBody = `vehicle: ${vehicleId} - ${new Date().toISOString()}`;

  try {
    await sqs.sendMessage(QueueParams).promise();
    console.log(`SQS:SUCCESS - AddToQueue - ${vehicleId}`);
  } catch (error) {
    console.log(`SQS:ERROR - AddToQueue - ${error}`);
  }
};

. Когда это происходит в первый раз, сообщение не попадает в SQS, но любое другое последующее сообщение добавляется в очередь и обрабатывается. Я перепробовал кучу вещей IAM-разрешений, настроек в очереди, воссоздания очереди, и ничего из этого не помогло.

Я не получаю сообщение об успехе или об ошибке, поэтому не могу отладить какую-либо выпуск.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

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

Во всех случаях это было связано с неправильным ожиданием асинхронного кода. Я недостаточно знаю о javascript и Lambda, чтобы объяснить поведение, особенно задержки - могут ли обещания разрешиться после того, как обработчик вернулся, но пока контейнер еще работает? Но что я знаю, так это то, что если лямбда возвращается до того, как обещания (асин c функции возвращают обещания) будут разрешены (и, следовательно, до того, как асинхронный код завершит работу, что вызывает наблюдаемое поведение кода, которое задерживается или не выполняется) тогда их не ожидали правильно.

0 голосов
/ 29 января 2020

Возможно, вы не ожидаете внутри функции asyn c, которую вы вызываете AddToQueue()

Если вы не вызываете AddtoQueue() внутри функции asyn c и не ожидаете ее там, AddToQueue запустится после того, как этот код выполняется.

Итак, позвольте мне привести вам пример.

У вас есть 2 файла в тестовой директории.

await. js main. js

await. js is:

module.exports = async ()=> {

await new Promise((res, rej)=>{
    setTimeout(()=>{
        res(console.log('Running'));
    }, 2000)
})

}

И основной. js

console.log('Hello')
require('./await')();

console.log('World')

При запуске main. js, node main.js, Hello world будут запускаться, затем после разрешения обещания он будет вытеснен из очереди в ваш стек запуска и запущен последним.

Hello
World
// After 2 secs
Running

Но вместо этого, если в основном. js

(async ()=>{
console.log('Hello')
await require('./await')();

console.log('World')
})()

Вы дадите знать javascript engine это asyn c функция, и дождитесь, пока этот модуль запустится, и вы получите ожидаемые результаты.

Hello
// After 2 seconds
Running
World

В основном вы говорите javascript двигатель I do not want you to run it your way, but run it my way.

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