gpt4 book ai didi

javascript - 在同步函数中从 AWS Lambda 发出 AWS CloudWatch 指标

转载 作者:行者123 更新时间:2023-12-05 06:50:21 36 4
gpt4 key购买 nike

我正在寻找一种解决方案,借此我可以安全地(并且几乎可靠地)在同步代码中发出 CW 指标 (putMetricData)。我的用例如下:

// Lambda Main Handler

export const handler = async () => {
await step1Aync();
step2Sync();
step3Sync();
return {};
}

async function step1Aync() {
await doSomething();
await doSomething();
// could await this call, but dont want to since I dont need the value, nor do I want to handle failures
cloudwatch.putMetricData();
}

function step2Sync() {
doSomething();
// do not want to make this function async to use await here
cloudwatch.putMetricData();
}

function step3Sync() {
doSomething();
// do not want to make this function async to use await here
cloudwatch.putMetricData();
}

我的理解是,当 putMetricData 请求被推送到 Lambda 的事件循环中时,无法保证它们最终会将 HTTP 请求发送到 CW(因为 Lambda 执行上下文可能会在请求发生之前卡住).这是当然的,除非我让 step2Syncstep3Sync 异步并且为每个 Promise 使用 await

我的部分推理是,我想通过明确不处理来自 CloudWatch 的响应来减少 Lambda 的响应时间。这个 Lambda 是一个时间敏感的 API(API 网关)。如果对 CW 的“某些”请求失败(少于 1%),那没关系。

我读到如果再次使用相同的 Lambda 上下文,它将清空事件循环。然而,这并不能保证。我不知道这里的 SLA 是什么,可以这么说。

简而言之,我不想在没有明确要求的情况下使用异步函数的任何人。我的理解对吗?

最佳答案

可能的解决方案:

定义一个不断添加的全局数组,然后在函数末尾的一次 Promise.all 调用中将该数组刷新到 CloudWatch。我们仍然需要等待调用,但它最终会同时或并行完成(取决于底层硅)。

//全局指标数组

export const PENDING_METRICS: PutMetricDataInput[] = [];

//处理程序

// Lambda Main Handler

export const handler = async () => {
await step1Aync();
step2Sync();
step3Sync();

// emit all of the metrics
await Promise.all( PENDING_METRICS.map(emitMetricToCloudWatch) );

// clear the global array for safety
PENDING_METRICS.length = 0;
return {};
}

async function step1Aync() {
await doSomething();
await doSomething();
PENDING_METRICS.push(PutMetricDataInput)
}

function step2Sync() {
doSomething();
PENDING_METRICS.push(PutMetricDataInput)
}

function step3Sync() {
doSomething();
PENDING_METRICS.push(PutMetricDataInput)
}

//云观察代码

export const emitMetricToCloudWatch = async (client, input) => client.putMetricData(input);

注意:全局对象可以渗透到其他执行上下文中。因此,在发出每个指标后需要清空该数组。

关于javascript - 在同步函数中从 AWS Lambda 发出 AWS CloudWatch 指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66416633/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com