[英]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
}
```
您的代碼中存在很多誤解。 我將嘗試指導您修復它並了解如何正確執行此操作。
為了幫助您完成這項任務,我完全重寫了您的代碼以解決這些誤解。
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.