簡體   English   中英

AWS Lambda 中的異步 HTTP 請求

[英]Asynchronous HTTP request in AWS Lambda

我想在 API 網關調用的 lambda 函數內執行 http 請求。 問題是,請求需要一些時間來完成(<20 秒)並且不希望客戶端等待響應。 在我對異步請求的研究中,我了解到我可以通過X-Amz-Invocation-Type:Event標頭使請求異步執行,但是這不起作用並且代碼仍然“等待”http 請求完成.

下面是我的 lambda 代碼:

'use strict';

const https = require('https');

exports.handler = function (event, context, callback) {
    let requestUrl;
    requestUrl = event.queryStringParameters.url;

    https.get(requestUrl, (res) => {
        console.log('statusCode:', res.statusCode);
        console.log('headers:', res.headers);

        res.on('data', (d) => {
            process.stdout.write(d);
        });
    }).on('error', (e) => {
        console.error(e);
    });

    let response = {
        "statusCode": 200,
        "body": JSON.stringify(event.queryStringParameters)
    };
    callback(null, response);
};

任何幫助,將不勝感激。

您可以使用兩個Lambda函數。

Lambda 1由API網關觸發,然后異步調用Lambda 2( InvocationType = Event ),然后向用戶返回響應。

Lambda 2一旦被調用,將觸發HTTP請求。

無論您做什么,都不要使用兩個 lambda 函數。

您無法控制 lambda 的調用方式,異步或同步。 lambda 的調用者決定了這一點。 對於 APIGW,它決定調用 lambda 同步。

可能的解決方案是以下之一:

  • 質量標准
  • 階躍函數 (SF)
  • 社交網絡

在您的 API 中,您調用這些服務之一,獲得成功,然后立即向您的調用者返回 202。

如果您有大量的單操作或雙操作執行,請使用 SQS。 如果您可能長時間運行復雜的狀態邏輯,請使用 SF。 如果您出於某種原因想忽略我的建議,請使用 SNS。

這些中的每一個都可以(並且應該)回調到 lambda。 如果您需要運行超過 15 分鍾,他們可以回調CodeBuild 忽略服務的名稱,它只是一個支持長達 8 小時運行的 lambda。


現在,為什么不使用兩個 lambdas (L1, L2)? 答案很簡單。 一旦您響應您的異步調用已排隊(SQS、SF、SNS),您的用戶 (202)。 他們會期望它 100% 有效。 但是如果 L2 lambda 失敗會發生什么。 它不會重試,也不會繼續,你可能永遠不會知道。

L2 lambda 的處理程序不再存在,因此您不再知道狀態。 此外,您可以嘗試使用包裝器try/catch將日志記錄添加到 L2,但可能會發生許多其他類型的故障。 即使你有那個,CloudWatch 宕機了,你會得到日志嗎? 可能不是,它只是不是一個可靠的策略。 當然,如果你正在做一些你不關心的事情,你可以構建這個架構,但這不是真正的生產解決方案的構建方式。 你想要一個可靠的過程。 您希望相信接力棒已成功傳遞給另一個負責完成用戶交易的服務。 這就是為什么您要使用以下三種服務之一:SQS、SF、SNS。

暫無
暫無

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

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