Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 导致问题的并发AWS Lambda处理_Javascript_Amazon Web Services_Aws Lambda - Fatal编程技术网

Javascript 导致问题的并发AWS Lambda处理

Javascript 导致问题的并发AWS Lambda处理,javascript,amazon-web-services,aws-lambda,Javascript,Amazon Web Services,Aws Lambda,我正在构建一个温度传感器应用程序,它通过实时传感器测量温度,如果温度超出范围,则生成警报。我使用的是AWS Lambda和AWS物联网平台。API网关将传感器数据发布到AWS IOT,从而触发“传感器/温度”规则,该规则为lambda。此lambda获取传感器数据并将其存储在dynamo db中,然后将数据与存储的温度范围进行比较并生成警报。这是对温度λ的响应 { "Timestamp": "2017-09-14 19:12:05", "Raw Timestamp": 1505416325.

我正在构建一个温度传感器应用程序,它通过实时传感器测量温度,如果温度超出范围,则生成警报。我使用的是AWS Lambda和AWS物联网平台。API网关将传感器数据发布到AWS IOT,从而触发“传感器/温度”规则,该规则为lambda。此lambda获取传感器数据并将其存储在dynamo db中,然后将数据与存储的温度范围进行比较并生成警报。这是对温度λ的响应

{
 "Timestamp": "2017-09-14 19:12:05",
 "Raw Timestamp": 1505416325.907,
 "Mac": "9c:65:f9:1b:f8:3c",
 "Diagnostics": [
    "SensorMon",
    "1/1 Entries"
 ],
 "SensorReadings": {
    "sensor-1": {
       "Door": 0,
       "Temperature": 36,
       "Battery": "3.06",
       "Humidity": 27,
       "SensorModuleId": "sensor-1"
    }
 }
}
现在,如果温度超出范围,我会在“开始时间”生成一个警报,即“超出范围”,等于“原始时间戳”,并将警报表中的“已完成”属性设置为“false”,这样我会每分钟检查一次数据,如果数据仍然“超出范围”,并且“已完成”属性为“false”,我不会生成新警报。现在假设温度在范围内,那么我将通过将其“结束时间”设置为“原始时间戳”和“完成”属性设置为“true”来结束警报。只有现在我才能生成新警报。在此之后,我通过执行“结束时间”-“开始时间”来计算持续时间

现在我面临的问题是,当数据以较慢的速度发生变化时,即温度变化时,如果超出范围长时间保持超出范围,如果超出范围则长时间保持在范围内。当数据变化很快时,我开始得到负值“Duration”

我想我已经发现duration的负值是由于一个死锁造成的,这个死锁发生在lambda请求仍在处理时,同时,一个新的请求出现。假设我们从开始时间“x”发出温度“超出范围”警报。现在传感器显示温度在一个时间范围内,比如说“y”(y>x),所以该处理开始。现在,由于该处理正在进行,传感器表示温度再次“超出范围”,因此将在时间“z”(z>y>x)时生成新警报,表示温度“超出范围”

现在,时间“y”处的请求仍在处理中。当它处理时,当我们考虑“完成”的字段时,将在“X”和“Z”到“Y”时设置两个告警的结束时间,这将导致启动时“Z”的警报持续时间为负。
那么,您能想象这样一种场景吗?即只有在前一个请求完成时,或者通过其他方式,才发生新的lambda处理请求?任何帮助都将不胜感激。

@TrentBartlem Kinesis和DynamoDB都是基于流的源代码,在并发性方面不会有任何区别。Anand,您是否在DynamoDB中使用版本号的乐观锁定?这样,您就可以发现并发性问题,并确定是使用更新的日期重试请求,还是将其作为过期数据丢弃。@TrentBartlem实际上我使用dynamodb只是为了存储数据。我不是从中提取数据然后再处理数据,而是当响应首先出现时,我将其存储在dynamodb中,同时在同一个lambda中进行这些警报计算。那么“然后将数据与存储的温度范围进行比较”意味着什么呢?哦,对不起,我的糟糕!温度范围是从RDS获取的,RDS存储了温度范围、上次采样时间等详细信息。@TrentBartlem Kinesis和DynamoDB都是基于流的源代码,在并发性上不会有差异。Anand,您是否在DynamoDB中使用版本号的乐观锁定?这样,您就可以发现并发性问题,并确定是使用更新的日期重试请求,还是将其作为过期数据丢弃。@TrentBartlem实际上我使用dynamodb只是为了存储数据。我不是从中提取数据然后再处理数据,而是当响应首先出现时,我将其存储在dynamodb中,同时在同一个lambda中进行这些警报计算。那么“然后将数据与存储的温度范围进行比较”意味着什么呢?哦,对不起,我的糟糕!温度范围从RDS获取,RDS存储温度范围、上次采样时间等详细信息。