使用lambda和mysql进行无限缩放最终会导致错误的数据

时间:2018-11-07 21:27:03

标签: node.js architecture aws-lambda scaling amazon-sqs

我们正在尝试无限的可扩展性,并使用无服务器架构来加快我们的流程,并在lambda之上使用AWS sqs

我们的数据是一连串的突变,这些突变基于id相互叠加。

id  productId    eventDate   eventValue    balance
 1    1          2018-09-01    100          100
 2    1          2018-09-01    100          200

如您所见,它从上一行中获取余额并在其中添加事件值并获得新余额非常容易,每个新值都来自sqs,这会触发一个lambda,然后我们的流程计算出值并将其添加到事件表。问题是,当有多条消息插入其中时,会产生多个lambda,它们都在寻找上一行,而我们最终得到的是最后存储的记录,最终像

id  productId    eventDate   eventValue    balance
 1    1          2018-09-01    100          100
 2    1          2018-09-01    100          200
 3    1          2018-09-01    100          300
 4    1          2018-09-01    100          300
 5    1          2018-09-01    100          300  

问题是他们都认为他们以前的行余额是200,所以他们在其中添加了事件值,计算就出错了。

我们可以捆绑输入并一个接一个地执行操作,但这将完全破坏扩展的目的,并且从长远来看,使用大输入将使速度变慢。乐观锁定似乎也没有帮助我们,因为它是基于先前条目的新条目。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

您的表似乎只是追加的,并且您计算余额的方式是错误的,因为您可能同时插入多个记录并使用相同的数据。

您可以通过运行以下更新查询将余额存储在另一个表中进行更新: UPDATE table SET balance = balance + ? WHERE product_id = ?