使用具有单个 table 设计的 dynamodb 流 - 仅处理特定的项目类型

Using dynamodb streams with a single table design - handle only specific item types

我一直在使用 Dynamodb 作为数据库构建无服务器应用程序,并且一直遵循单一 table 设计模式(例如 https://www.alexdebrie.com/posts/dynamodb-single-table/)。我开始遇到的事情是使用 dynamodb 流 - 我希望能够使用 dynamodb 流来保持 Elasticsearch 实例最新。

目前,单个 dynamodb table 拥有大约 10 种不同类型的物品(将继续扩展),其中一种物品类型,'event'(如在体育赛事中)将被发送到复杂 querying/searching 的弹性搜索实例。因此,对 'event' 项目的任何更改都需要通过流触发的 lambda 函数在 Elasticsearch 中进行更新。

我正在努力解决的是,我将在 'update' 上的任何 table 项目上触发 lambda,但这也可能是其他 9+ 项目之一的更新项目类型,我在 lambda 中得到它,我可以检查更新的项目并检查其类型等,但是几乎 any 更新为 any 似乎很浪费 项目类型将触发 lambda,这可能比需要的次数多很多。

有没有更好的方法来处理这个问题,以减少浪费并只针对一种项目类型?我在想,随着应用程序的增长和需要更多的流触发器,至少会有一个 'update' lambda 已经被触发,我可以 运行 一些逻辑来查看什么类型的项目被更新了,但我只是担心我错过了一些事情。

不幸的是,您描述的方法是处理 DynamoDb 流的唯一方法。我自己也走了同样的路,认为这不是正确的用法,但这是处理流的唯一方法。

您可以使用 Lambda Event Filtering。这将允许您防止特定事件调用您的函数。对于单个 table DynamoDB 设计模式,您可以仅过滤掉具有 type: EVENT.

的记录

如果您碰巧正在使用无服务器框架,以下 yaml 片段展示了如何轻松实现此功能。

functionName:
  handler: src/functionName/function.handler
  # other properties
  events:
  - stream:
      type: dynamodb
      arn: !GetAtt DynamoDbTable.StreamArn
      maximumRetryAttempts: 1
      batchSize: 1
      filterPatterns:
        - eventName: [MODIFY]
          dynamodb:
             MyTableName:
               type:
                 S: [EVENT]

注意存在多个比较运算符,例如 begins with 即 [{"prefix":"EVENT"}] ~ 请参阅 Filter rule syntax 了解更多信息。