单击计数器会减慢我的 DynamoDB API 吗?
Will a click counter slow down my DynamoDB API?
我想创建一个 DynamoDB WebAPI。它允许创建和读取 Posts。现在我想实现一个点击计数器,在每次用户请求时更新 post 的流行度。因此,每次收到 post 的 GET 请求时,我都会更改 Post 对象本身。
但我知道 DynamoDB 针对读取进行了优化,而不是针对写入进行了优化。因此,每次更新正在获取的对象可能是一个问题。
那么如何在不减慢 API 本身的情况下衡量 post 的受欢迎程度呢?我正在考虑为每次提取生成一个随机数,并且仅在低于 0.05 或类似值时才更新它。
但是有更好的解决方案吗?
Dynamo DB 并未“针对读取进行优化”,而是针对“在任何规模下提供一致的个位数毫秒响应时间”进行了优化。
为了优化 DDB 的读取,您需要在其前面放置一个 Amazon DynamoDB 加速器 (DAX) 实例以“以微秒级延迟实现更快的访问”。
实际上,DDB read/write 性能不会成为问题。在您的情况下,您的应用程序和 DDB 之间的网络延迟将高出几个数量级。通过一个接一个地同步调用,您的响应时间将加倍;不管你写的是什么云数据库。
假设数据和计数器在同一条记录中,在这种情况下简单的 DDB 解决方案是不调用 GetItem()
而调用 UpdateItem()
。相反,只需使用 UpdateExpression
调用 UpdateItem()
,该 UpdateExpression
使用 ADD
表达式将 1 添加到您的计数器,并将 ReturnValues
属性添加到 return ALL_OLD
或 ALL_NEW
.
其他更复杂的解决方案
- 假设您已经获得要显示的数据,请异步调用 UpdateItem()。
- 在规模上,您可能会考虑断开计数器更新与您的应用程序的连接。您的应用程序 post 一条 SQS 消息,由 lambda 处理,可以使用对 DDB 的批量更新。
我想创建一个 DynamoDB WebAPI。它允许创建和读取 Posts。现在我想实现一个点击计数器,在每次用户请求时更新 post 的流行度。因此,每次收到 post 的 GET 请求时,我都会更改 Post 对象本身。
但我知道 DynamoDB 针对读取进行了优化,而不是针对写入进行了优化。因此,每次更新正在获取的对象可能是一个问题。
那么如何在不减慢 API 本身的情况下衡量 post 的受欢迎程度呢?我正在考虑为每次提取生成一个随机数,并且仅在低于 0.05 或类似值时才更新它。
但是有更好的解决方案吗?
Dynamo DB 并未“针对读取进行优化”,而是针对“在任何规模下提供一致的个位数毫秒响应时间”进行了优化。
为了优化 DDB 的读取,您需要在其前面放置一个 Amazon DynamoDB 加速器 (DAX) 实例以“以微秒级延迟实现更快的访问”。
实际上,DDB read/write 性能不会成为问题。在您的情况下,您的应用程序和 DDB 之间的网络延迟将高出几个数量级。通过一个接一个地同步调用,您的响应时间将加倍;不管你写的是什么云数据库。
假设数据和计数器在同一条记录中,在这种情况下简单的 DDB 解决方案是不调用 GetItem()
而调用 UpdateItem()
。相反,只需使用 UpdateExpression
调用 UpdateItem()
,该 UpdateExpression
使用 ADD
表达式将 1 添加到您的计数器,并将 ReturnValues
属性添加到 return ALL_OLD
或 ALL_NEW
.
其他更复杂的解决方案
- 假设您已经获得要显示的数据,请异步调用 UpdateItem()。
- 在规模上,您可能会考虑断开计数器更新与您的应用程序的连接。您的应用程序 post 一条 SQS 消息,由 lambda 处理,可以使用对 DDB 的批量更新。