簡體   English   中英

為什么我的 AWS lambda function 在使用私有 elasticache.network 調用以及外部 API 調用時隨機失敗?

[英]Why Does my AWS lambda function randomly fail when using private elasticache network calls as well as external API calls?

我正在嘗試編寫一個緩存 function 來返回緩存的 elasticcache 數據或進行 api 調用以檢索該數據。 但是,lambda function 好像很不靠譜,經常超時。

問題似乎是有 redis 電話以及公共 api 電話導致了這個問題。 我可以確認我已經使用帶有 inte.net 網關的 su.net 和帶有 nat 網關的私有 su.net 正確設置了 aws。 function 有效,但只有 10% 的時間。剩余時間的執行在撥打 API 之前停止。 我還注意到在創建 redis 客戶端后 api 調用失敗。 如果我在進行 redis 檢查之前進行外部 api 調用,那么 function 似乎更可靠並且不會超時。

不知道該怎么辦。 將這兩項任務分開是最佳做法還是我做錯了什么?

    let data = null;

module.exports.handler = async (event) => {
  //context.callbackWaitsForEmptyEventLoop = false;
  let client;
  try {
    client = new Redis(
      6379,
      "redis://---.---.ng.0001.use1.cache.amazonaws.com"
    );

client.get(event.token, async (err, result) => {
      if (err) {
        console.error(err);
      } else {
        data = result;
        await client.quit();
      }
    });

    if (data && new Date().getTime() / 1000 - eval(data).timestamp < 30) {

      res.send(`({
        "address": "${token}",
        "price": "${eval(data).price}",
        "timestamp": "${eval(data).timestamp}"
      })`);
    } else {
      getPrice(event); //fetch api data
    }
    ```
   

您的代碼中存在很多誤解。 我將嘗試指導您修復它並了解如何正確執行此操作。

  1. 您在 function 中混合了異步和同步代碼。
  2. 您應該使用 JSON.parse 而不是 eval 來解析數據,因為 eval 允許在您的 function 中執行任意代碼
  3. 您正在使用 res.send 將響應返回給客戶端而不是回調。 請記住,res.send 的用法僅在 express 中,您使用的是 lambda 並將結果返回給客戶端,您需要使用回調 function

為了幫助您完成這項任務,我完全重寫了您的代碼以解決這些誤解。

const Redis = require('ioredis');

module.exports.handler = async (event, context, callback) => {
  // prefer to use lambda env instead of put directly in the code
  const client = new Redis(
    "REDIS_PORT_ENV",
    "REDIS_HOST_ENV"  
  );

  const data = await client.get(event.token);
  client.quit();
  const parsedData = JSON.parse(data);
  if (parsedDate && new Date().getTime() / 1000 - parsedData.timestamp < 30) {
    callback(null, {
      address: event.token,
      price: parsedData.price,
      timestamp: parsedData.timestamp
    });
  } else {
    const dataFromApi = await getPrice(event);
    callback(null, dataFromApi);
  }
};

lambda 的另一種用法是返回 object 而不是傳遞 object 內部回調,但我認為你明白了你的想法並理解了你的錯誤。

遵循有關正確使用 lambda 的文檔: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-lambda-functions.html

要了解更多關於 javascript 中的異步和同步: https://www.freecodecamp.org/news/synchronous-vs-asynchronous-in-javascript/

JSON.parse x eval: JSON.parse 與 eval()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM