AWS Лямбда не может обновить все записи - PullRequest
1 голос
/ 25 мая 2020

Я использую AWS SES mail с nodemailer. Когда электронное письмо отправлено, идентификатор сообщения, созданный для этого электронного письма, сохраняется в моей БД. Как только электронное письмо получено получателем, с помощью SNS я получаю электронное письмо с уведомлением, и срабатывает лямбда. Я использую эту лямбду, чтобы получить обновленный статус электронной почты и обновить его в своей БД. Я создал лямбда-функцию, загрузив zip-папку пакета в AWS.

Когда я отправляю одно электронное письмо, оно отправляется, и лямбда может обновить БД. Но если я отправляю 10 писем сразу, все письма отправляются, но лямбда обновляет только 5-8 записей.

Mysql: 2.18.1 УЗЕЛ: 12.x

Код PFB of Lambda,

const config = require("./config.json");


const getConnectionPool = ( dbname ) => {
  const params = {
    host: config.dbhost,
    user: config.dbuser,
    password: config.dbpassword,
    database: dbname,
    multipleStatements: true,
    // debug:true
  }
  const pool = mysql.createPool( params );
  return pool;
}

const getParameters = ( event ) => {
  const data =event.Records[0];
  let eventType = 0;
  const record = JSON.parse(data.Sns.Message);

  const mail =  record.mail;
  const headers = mail.headers[3];
  let dbname  = headers.value;
  dbname = dbname.replace("<", "");
  dbname = dbname.replace(">", "");

  if( record.eventType == "Delivery" ) {
    eventType = 2;
  } else if( record.eventType == "Bounce" ) {
    eventType = 3;
  }else if( record.eventType == "Complaint" ) {
    eventType = 4;
  }else if( record.eventType == "Reject" ) {
    eventType = 5;
  }
  return {
    eventType: eventType,
    messageId: mail.messageId,
    dbname: dbname
  }
}

exports.handler = (event, context, callback) => {

  let params  = getParameters( event );


  //prevent timeout from waiting event loop
  context.callbackWaitsForEmptyEventLoop = false;

  const pool = getConnectionPool( params.dbname );

  pool.getConnection( (err, connection) => {
    // Use the connection
     connection.query(
      "START TRANSACTION;SET SQL_SAFE_UPDATES = 0;update email_logs set bool_is_sent = " + mysql.escape( params.eventType ) + " where message_id= " + mysql.escape( params.messageId ) + ";SET SQL_SAFE_UPDATES = 1;COMMIT;", 
       (error, results ) => {

        // And done with the connection.
        connection.release();
        // Handle error after the release.
        if (error) callback(error);
        else callback(null, results[0]);
      }
    );
  });
};

Просто фрагмент журнала cloudwatch

OkPacket {
    fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 43,
    warningCount: 0,
    message: '(Rows matched: 0  Changed: 0  Warnings: 0',
    protocol41: true,
    changedRows: 0
  },

Что здесь не так.

Ответы [ 2 ]

0 голосов
/ 12 июня 2020

Итак, проблема заключалась в том, что сначала вызывалась лямбда, а затем идентификатор сообщения сохранялся в базе данных. Из-за этого лямбда не получала записи для обновления, и я получал 0 затронутых строк.

0 голосов
/ 25 мая 2020

Если социальная сеть получает несколько обновлений для разных электронных писем одновременно, возможно, ваша лямбда-функция получит объединенные записи в одном событии (так что ваша лямбда-функция может, например, запускаться 3 раза для 10 обновлений).

Вы получаете доступ только к первой записи (event.Records[0]), но их может быть несколько.

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