AWS Cloudwatch запускает функцию лямбда с задержкой - PullRequest
0 голосов
/ 01 мая 2020

Я создаю приложение для онлайн-радио с Expo и RN, где пользователи могут получать уведомления о программе, которая в настоящее время выходит в эфир. Я пытаюсь использовать функцию AWS Lambda, связанную с базой данных DynamoDB, для отправки функций в службу уведомлений Expo Pu sh, и я запускаю эту функцию через 5 минут с Cloudwatch.

Сейчас в этой функции я отправляю уведомление, а в теле сообщения добавляю текущее время и название воспроизводимого в настоящее время. Затем я установил правило Cloudwatch, которое срабатывает каждые 5 минут. После этого я ожидаю получить уведомление, содержащее текущую информацию, проблема в том, что я получаю время и название игры в 5 минут ДО получения уведомления.

Я сомневаюсь, что это задержка traffi c или что-то еще, поскольку Я получаю уведомления каждые 5 минут последовательно, но с информацией за 5 минут до этого. Я пытался создать новое правило с теми же результатами. Я попытался вручную добавить выражение cron в расписание, но все равно получаю тот же результат.

Вот код, который у меня есть в лямбда-функции:

const https = require("https");
const AWS = require("aws-sdk");

const { Expo } = require('expo-server-sdk');
let expo = new Expo();

AWS.config.update({region: "us-east-2"});

let ddb = new AWS.DynamoDB({apiVersion: "2012-08-10"});

let retrieveParams = {
  TableName: "playing",
  Key: {
    "curr": {N: "1"}
  },
};

exports.handler = async (event) => {
    let dataString = '';
    let lastPlaying = "";
    let currPlaying = "";

    // Gets the latest played item
    ddb.getItem(retrieveParams, function(err, data) {
      if (err) {
        console.log("Error", err);
      } else {
        lastPlaying = data.Item.title.S;
      }
    });

    // Gets the currently playing title
    const response = await new Promise((resolve, reject) => {
        const req = https.get("http:serverurlsomethingsomething", function(res) {
          res.on('data', chunk => {
            dataString += chunk;
          });
          res.on('end', () => {
            resolve({
                statusCode: 200,
                body: JSON.parse(dataString)
            });
          });
        });

        req.on('error', (e) => {
          reject({
              statusCode: 500,
              body: 'Something went wrong!'
          });
        });
    });

    currPlaying = response.body.data[0].song;

    // Update the ddb if the current title has changed
    if (currPlaying !== lastPlaying) {
      // Updates the dynamoDB
      let newParams = {
        TableName: "playing",
        Item: {
          "curr": {N: "1"},
          "title": {S: currPlaying}
        }
      }; 

      ddb.putItem(newParams, function(err, data) {
        if (err) {
          console.log("Error", err);
        } else {
          console.log("Success", data);
        };
      });


      // Create the messages that you want to send to clents
      let messages = [];
      let somePushTokens = ["MyPhonesToken"]
      for (let pushToken of somePushTokens) {
        // Each push token looks like ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]

        // Check that all your push tokens appear to be valid Expo push tokens
        if (!Expo.isExpoPushToken(pushToken)) {
          console.error(`Push token ${pushToken} is not a valid Expo push token`);
          continue;
        }

        // Construct a message (see https://docs.expo.io/versions/latest/guides/push-notifications)
        messages.push({
          to: pushToken,
          sound: 'default',
          body: `Minutes: ${new Date().getMinutes()} Seconds: ${new Date().getSeconds()} Title: ${currPlaying}`,
        })
      }

      let chunks = expo.chunkPushNotifications(messages);
      (async () => {
        // Send the chunks to the Expo push notification service. There are
        // different strategies you could use. A simple one is to send one chunk at a
        // time, which nicely spreads the load out over time:
        for (let chunk of chunks) {
          try {
            await expo.sendPushNotificationsAsync(chunk);
          } catch (error) {
            console.error(error);
          }
        }
      })();

      return "different";
    };

    return "same";
};

А вот как Правило Cloudwatch выглядит так:

Итак ... есть идеи, в чем может быть проблема? Я что-то упустил?

PD. Да ... Я переместу лог c уведомлений pu sh в отдельный файл, чтобы сохранить код в чистоте.

...