2

我试图使用 Lambda@Edge 在我的站点中处理 A/B 测试。我想知道有没有办法让 Lambada@Edge 函数从 url 加载外部配置数据,例如。我创建了一个 api 来返回 A/B 通道的流量速率,我想控制外部的配置数据,这样我就可以动态调整流向 A 或 B 通道的流量,而无需修改 Lambda 函数。我现在做的是

var versions = [];
var isLoadingVersionData = false;
const https = require('https');
function loadVersions() {
if (isLoadingVersionData)
    return null;

isLoadingVersionData=true;

https.get('https://example.com/getAbTestConfig', (res) => {
    res.on('data', (d) => {
        var parsedBody = JSON.parse(d);
        if (parsedBody.status)
            versions = parsedBody.data;

    });

    }).on('error', (e) => {
       console.log(e);
    });
}

//and load the function in handler
exports.handler = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    loadVersions();
}

我想知道这个变量“版本”可以正确加载并在以后的每个请求中共享

你有一些更有效的解决方案吗?

4

2 回答 2

0

为什么不在 S3 中维护这些数据并使用您的 Lambda@Edge 从那里获取配置?为了进一步减少延迟,您可以使用 CloudFront 将包含流量比率的 S3 存储桶放在前面,并让您的 L@E 调用 CloudFront 并获取所需的值。

于 2018-11-15T07:09:25.933 回答
0

我面临同样的问题,但不是 A/B 测试。我刚刚在我的 lambda 函数中创建了一个 json 文件,以避免在 lambda 函数中进行 http 调用的延迟。它可以工作,但维护不好,因为每次我需要更改 Json 文件时,我都需要再次部署 lambda 函数。

当我在搜索它时,我发现了上面为 Mr.Ocean 描述的相同解决方案,听起来像是在 S3 中维护数据的好选择。

于 2018-11-15T21:20:02.257 回答