Amazon web services 在AWS lambda中,提取、转换、聚合和写入DynamoDB的最佳方法是什么

Amazon web services 在AWS lambda中,提取、转换、聚合和写入DynamoDB的最佳方法是什么,amazon-web-services,aws-lambda,amazon-dynamodb,Amazon Web Services,Aws Lambda,Amazon Dynamodb,我想获得第二个选项,在我的以下用例中使用AWS服务: 客户端调用lambda函数并将发票记录写入DynamoDB(InvoiceTbl) 在发票中,有一组账单存储为json属性-[{bill1,bill2,bill3}],我想将其拆分并分别写入BillTbl,只有当发票的状态标记为Paid 如果发票已支付,我还将汇总金额并将其更新为InvoiceTotalTbl 当然,直接的方法是在lambda函数中实现它们。但是,我想将2和3分离到另一个进程中。我在想: 设计1 使用InvoiceTbl上的D

我想获得第二个选项,在我的以下用例中使用AWS服务:

  • 客户端调用lambda函数并将
    发票
    记录写入DynamoDB(
    InvoiceTbl
  • 发票
    中,有一组
    账单
    存储为json属性-
    [{bill1,bill2,bill3}]
    ,我想将其拆分并分别写入
    BillTbl
    只有当
    发票的
    状态标记为Paid
  • 如果
    发票
    已支付
    ,我还将汇总金额并将其更新为
    InvoiceTotalTbl
  • 当然,直接的方法是在lambda函数中实现它们。但是,我想将
    2和3分离到另一个进程中。我在想:

    设计1
  • 使用
    InvoiceTbl
    上的
    DynamoDB流
    触发另一个lambda函数
  • 在该lambda函数中,检查
    发票
    状态是否为已付款,然后执行
    2和3

  • 设计2
  • 在lambda函数中,如果
    发票
    状态为已付款,则将其添加到
    SQS
  • 然后,
    SQS
    将调用lambda函数执行
    2和3
  • 欺骗
    SQS
    的有效负载限制为256 KB


    设计3
  • 使用步进功能
  • 一旦
    发票
    状态转换为已付款,它将执行
    2和3
  • 欺骗
    步进功能
    价格昂贵(按成本计算)


    设计1在速度方面似乎不错-
    2和3
    可以快速执行,不会有太多延迟。但我不喜欢每次都被触发的想法<只有当
    发票
    状态为已支付时,才应触发代码>2和3,而且我担心随着时间的推移,成本会越来越高

    对于我的特定用例,还有其他更好的设计/aws服务吗


    谢谢。

    如果您只想追求“快速且经济高效”,那么将其全部保留在相同的Lambda函数中将是一条可行之路。每件事都是一种权衡,这里没有一种“最好”的方式来做某事,编程(和生活)中的几乎每件事都是如此。你不可能同时拥有完美解耦的系统和最具成本效益的系统。是的,我不应该要求“魔豆”。我的意思是更多的是对我的用例的设计范例的第二种意见。对于这个场景,我会投票给设计1,因为你已经在解耦(代码方面),无论如何,你只是在相同的lambda中触发它们(将给你成本和速度效益)。我不确定我是否理解它每次都会触发(2&3),2和3不应该每次都通过简单的状态检查触发,对吗?这里的区别在于,您正在分解跨多个服务的逻辑和流。你要把东西分解成多小/多细的颗粒,并将它们解耦?还要考虑跨多个服务的调试、部署和维护成本。@noobius。我的
    发票
    具有草稿和已付款状态。每当用户保存发票时,流lambda将始终必须检查状态是否已支付,然后继续执行
    2和3
    。在保存到我的发票TBL的10次中,有9次将处于草稿状态,只有1次将处于付费状态,此时流lambda必须继续执行
    2和3
    。换句话说,将有10个流读取,但只有1个流读取将执行实际工作(
    2和3
    ),我将选择设计1。您将拥有一个独特的组件dynamodb来管理存储和lambda触发,这将降低体系结构的复杂性。您对条目大小的限制也会减少,因为在dynamo上每个条目的数据量是400kb,而在SQS上是256kb。与SQS相比,从lambda向dynamo发送更大的批量(16mb)也具有优势