情况是我想在DynamoDB数据库中存储一些信息,然后如果我确定此信息已成功存储,则仅发送通知。这是我的代码的样子:
const putObj = Bluebird.promisify(docClient.put, { context: docClient })
// ... a promise chain collecting information...
const params = {
TableName: 'my_table',
Item: {
name: itemName
}
}
return putObj(params)
.then((data) => {
if (Ramda.equals(data, {})) {
// ... send notification here
.catch((err) => {
throw err
})
我假设如果存储数据时出错,则会在catch
块中捕获,并且不会发送通知。但是,在某些情况下,我发现即使相应的信息尚未存储在数据库中,也会发送通知。这种情况很少发生 - 几乎在所有情况下,代码都可以根据需要发挥作用。
关于为什么/如何发生这种情况的任何想法,以及我可以做些什么来阻止它。 DynamoDB不会向.then
返回任何有用的信息 - 如果成功,它只是一个空对象,我已经在发送通知之前检查了这一点。
答案 0 :(得分:3)
您使用的是“最终一致”还是“强烈一致”的读物?
当您从DynamoDB表中读取数据时,响应可能不会 反映最近完成的写操作的结果。该 响应可能包括一些陈旧的数据。如果你重复阅读 请求在短时间后,响应应该返回最新的 数据
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html
您可能需要重试读取,否则请更改读取一致性值。