使用具有单个 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 了解更多信息。
我一直在使用 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 了解更多信息。