【发布时间】:2016-04-25 22:07:13
【问题描述】:
我有一个 Lambda 函数,它由 dynamoDB(表“A”)触发,并为每个检索到的执行计数和聚合到另一个 dynamoDB 表(表“B”)。 我的用例需要原子计数器的映射,
假设 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 创建一个 put_item 到表“B”:
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,但也没有用。
这是正常行为还是错误?
如果正常的话,有什么建议如何实现这个计数器映射任务吗?
【问题讨论】:
-
你是什么表 A 的哈希/范围键?
-
"如果我对同一个用户同时写入,计数器的 letter_map 映射将被重置" - 你遇到过这种问题吗?
-
为了简单起见,我把事情缩短了,但我的主分区键相当于“用户”(它实际上是一个散列的
userID),我的主排序键是一个letterID。是的,我遇到了这个问题。 -
所以如果你没有并发写信映射计数器工作?你说的重置是什么意思?字母图计数器再次变为 1?
-
是的,如果我每次写一个项目并等待它工作。不确定“重置”,但我观察到的是,在将 1000 个项目写入表“A”的两个确切系列之后,表“B”不一样(即不是确定性的)。我认为它“重置”或使用过时的数据。
标签: node.js amazon-web-services amazon-dynamodb aws-lambda