【以下的问题经过翻译处理】
嗨,我正在尝试找到一个最佳的设计模式,用于运行一个Lambda函数处理解码多个二进制负载类型,以确定在传入LoRa负载时使用哪个编码器。
基本的输入事件如下所示:
{
"WirelessDeviceId": "<<REDACTED>>",
"PayloadData": "BA==",
"WirelessMetadata": {
"LoRaWAN": {
"ADR": true,
"Bandwidth": 125,
"ClassB": false,
"CodeRate": "4/5",
"DataRate": "3",
"DevAddr": "01b9c3bb",
"DevEui": "<<REDACTED>>",
"FCnt": 312,
"FOptLen": 0,
"FPort": 4,
"Frequency": "904500000",
"Gateways": [
{
"GatewayEui": "<<REDACTED>>",
"Rssi": -96,
"Snr": 2.5
}
],
"MIC": "0110ac72",
"MType": "UnconfirmedDataUp",
"Major": "LoRaWANR1",
"Modulation": "LORA",
"PolarizationInversion": false,
"SpreadingFactor": 7,
"Timestamp": "2021-12-23T19:58:35Z"
}
}
}
但是在这种情况下,对于我的Lambda解码器来说,它本身并不包含任何有用的信息,无法确定应使用哪个解码器。
在Lambda内部,我有一个Node.js脚本,其中包含一堆自定义解码器作为单独的模块,每个模块专门为特定的设备类型构建(按制造商和型号分类)。处理程序使用简单的if语句导入适当的模块,并通过该解码器运行有效负载。类似于以下方式:
const decodera = require('./lib/decodera');
const decoderb = require('./lib/decoderb');
exports.handler = async (event) => {
// Call the correct transformer function
if (event.DecoderType === 'a') {
return decodera(event);
} else if (event.DecoderType === 'b') {
return decoderb(event);
} else {
console.log(`A transformer for ${event.DecoderType} was not found.`);
}
};
最初,我为每个解码器都设置了一个单独的 Lambda,但这样会变得很复杂,因为您需要为每种新设备类型管理一大堆函数、规则和主题。所以我更倾向于只用一个,一旦事件发生,就让函数来决定正确的解码器。
至少我是这么想的。不过,这种方法似乎需要上述示例事件的一个丰富版本,其中包含使用哪个解码器的信息。因此,我正在尝试找出最佳处理方法。
1,我是否要将该信息存储在 Dynamo 中,然后先用 get_dynamodb()使用一个单独的规则(包含类似 "decoder_type "的内容),并将其添加到事件中,然后重新发布,aws_lambda() 规则会将其发送到解码器函数,在那里我将第二次重新发布到最终主题?
2、我是否至少可以将 get_dynamodb() 和 aws_lambda() 功能合并为一条规则?这里的问题是,我似乎仍然需要 Dynamo 存储某种键来告诉 Lambda 使用哪个解码器?
3、有没有更简单的方法?