gpt4 book ai didi

node.js - DynamoDB 中的原子计数器映射

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:18 27 4
gpt4 key购买 nike

我有一个由 dynamoDB(表“A”)触发的 Lambda 函数,并且对于每个检索到的数据执行计数并聚合到另一个 dynamoDB 表(表“B”)。我的用例需要原子计数器的 map ,

假设 dynamoDB 表“A”中的某个项目如下所示:

Item 1: {'user': 'foo', 'letter': 'a'}
Item 2: {'user': 'foo', 'letter': 'b'}
Item 3: {'user': 'foo', 'letter': 'b'}
Item 4: {'user': 'foo', 'letter': 'c'}
Item 5: {'user': 'bar', 'letter': 'a'}
Item 6: {'user': 'bar', 'letter': 'd'}

(注意:我的真实用例有数千个“用户”,每个用户有数千个项目,我的“字母”范围约为 400)

因此我希望表“B”看起来像:

Item 1: {'user': 'foo', letter_map {'a' : 1, 'b' : 2, 'c': 1}, total_letters : 4}
Item 2: {'user': 'bar', letter_map {'a': 1, 'd': 1}, total_letters : 2}

我有一个 AWS Lambda 函数,它处理来自表“A”的 dynamoDB 流,并使用以下 UpdateExpression 创建一个到表“B”的 put_item:

UpdateExpression: 'ADD letter_map.#letter :val, total_letters :val',
ExpressionAttributeNames: { '#letter' : RetreivedTableAItem['letter']}
ExpressionAttributeValues: {':val': 1}

问题是表 A 上的 put_items 可以并发发生,我希望原子计数器能帮助我解决并发问题,但我观察到 total_letters 计数器确实是原子的并且性能良好,而如果我对同一用户进行并发写入,则计数器的 letter_map 映射将被重置,

注意:在创建用户时,我创建一个空的 letter_map,以处理提到的限制 here 。我还尝试将所有可用字母的整个 letter_map 初始化为 0,但也不起作用。

这是正常行为还是错误?

如果正常的话,有什么建议可以实现柜台 map 的这个任务吗?

最佳答案

如果您的哈希键是“User”,则同一用户的表“B”上的 put_item 不能同时发生(通过 lambda)。每个 lambda 可以在一个 dynamo db 分片上工作,并且在每个分片上串行处理项目(以保护排序)。因此,如果“User”是您的哈希键,则可以保证用户“X”始终位于同一个分片上。

我认为,如果您遇到此类问题(重置),那是因为您的代码中存在其他错误。

来自 AWS doc :

发送到您的 AWS Lambda 函数的 Amazon Kinesis 和 DynamoDB Streams 记录是按分片严格序列化的。这意味着,如果您将两条记录放在同一个分片中,Lambda 会保证您的 Lambda 函数将在使用第二条记录调用之前成功地使用第一条记录调用。如果一条记录的调用超时、受到限制或遇到任何其他错误,Lambda 将重试,直到成功(或记录达到 24 小时到期时间),然后再继续处理下一条记录。不保证不同分片之间记录的顺序,并且每个分片的处理是并行发生的。

关于node.js - DynamoDB 中的原子计数器映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34893652/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com