限制DynamoDB表中每个实体存储的项目数



我是DynamoDB的新手,正在尝试解决一个问题。我正在设计一个包含多个实体的表(实体和属性不是真实的,但我希望它们能让你感知问题(:

  • 帖子
  • 注释

目标是在此表中存储要发布的帖子和N条最新评论。

假设Post实体具有属性:Title, Author, Text。PK:POST#<ID>和SK:#POST#<ID>。对于评论,我对作者、评论文本和提交日期感兴趣。所以属性应该是:Author, Text, SubmittedAt。PK:POST#<ID>和SK:#COMMENT#<COMMENT_ID>。我的物品看起来是这样的:

{"PK": "POST#1", "SK": "#POST#1", "Title": "Some", "Author": "john@doe.com", "Text": "Post text 1"}
{"PK": "POST#1", "SK": "#COMMENT#1", "Author": "author1@comment.post" "Text": "Some text1", "SubmittedAt": "2020-09-01T22:43:00+00:00"}
{"PK": "POST#1", "SK": "#COMMENT#2", "Author": "author1@comment.post" "Text": "Some text2", "SubmittedAt": "2020-09-02T22:43:00+00:00"}
{"PK": "POST#1", "SK": "#COMMENT#3", "Author": "author2@comment.post" "Text": "Some text3", "SubmittedAt": "2020-09-03T22:43:00+00:00"}

正如你们所能想象的,这篇文章可能很热门,经常被评论。我正在尽可能快、尽可能便宜地更新这张表。我需要在表中存储每个帖子最多5条评论。

到目前为止,我有两个想法:

  1. 先读后写:阅读评论,比较SubmittedAt,获取最旧的,推出并写新项目-->减慢";提交评论";操作(API调用(
  2. 写,使用DynamoDB Stream+Lambda进行后处理,这无论如何都需要读取整个内容-->引入了另一段要维护的代码以及stream和lambda的开销

实现这一目标的其他方法是什么?推荐哪一个?

提前谢谢!

事务是处理此用例的另一种方式。

您可以对Post项目中的注释数量进行计数,并且只有在计数低于5时才插入新注释。DynamoDB事务可以使用transact_write_items在单个操作中实现所有这些。例如:

dynamodbclient.transact_write_items(
TransactItems: [
{ // insert a new Post item
Put: {
TableName: my_table,
Item: {                  
PK: "POST#1",
SK: "COMMENT#1",
Author: "author1@comment.post",
Text: "some text 1",
submittedAt: "2020-09-03T22:43:00+00:00"
}
}
},
{ // conditionally Update the num_comments attribute 
Update: {
TableName: "my_table",
Key: {
PK: "POST#1",
SK: "POST#1"
},
ConditionExpression: "num_comments < 5",
UpdateExpression: "SET #num_comments = #num_comments + :incr",
ExpressionAttributeNames: {
"#num_comments": "num_comments"
},
ExpressionAttributeValues: {":incr": 1}
}
}
]
)

DynamoDB事务在一个请求中最多可以支持25个操作。交易是";要么全有要么全无";;要么所有操作都成功,要么全部失败。在这个特定的事务中,您要执行两个操作:

  1. 使用Put请求创建新的Comment项
  2. 仅当num_comments小于5时,才增加Post项上的num_comments计数器

如果num_comments小于5,事务将成功,您将插入Comment并递增Post.num_comments。否则,两个操作都不会发生。

请记住以下内容(来自文档(:

为DynamoDB表启用事务不需要额外的成本。您只为交易中的读写操作付费。DynamoDB对事务中的每个项执行两个底层读取或写入:一个用于准备事务,另一个用于提交事务。这两个底层读/写操作在您的AmazonCloudWatch指标中是可见的。

最新更新