我一直在与DynamoDB中的LSI和GSI合作,但我想我错过了一些东西。
我创建了一个索引,总是按最新结果查询而不使用其他属性的分区键,而不读取整个项目,只读那些真正重要的项目,但是在某些时候使用GSI我的查询返回的数据不是-至今;我理解这是因为文档中描述了最终的一致性(如果我错了,你可以纠正我)。
LSI怎么样?即使使用ConsistentRead,在某些时候我的数据也没有被正确查询,结果也不是最新的。从文档中我认为LSI与其表同步并且与ConsistentRead属性集同步,我总是得到最新的结果,但这不会发生。
我使用REST端点(API网关)在我的发电机表中执行插入(我在插入之前执行了一些处理)所以,我一直想知道这是否与它有关:也许代码(目前是Java)或DynamoDB更新速度很慢但是因为在我的端点中一切似乎都工作得很好我执行另一个请求的速度太快,或者我需要等待一段时间才能与表进行交互,因为索引正在更新,虽然我已经测试了等待更长时间,但我收到了同样错误的结果。我在这里有点迷失。
这是我用来查询索引的代码:
QuerySpec spec = new QuerySpec()
.withKeyConditionExpression("#c = :v_attrib1 and #e = :v_attrib2")
.withNameMap(new NameMap()
.with("#c", "attrib1")
.with("#e", "attrib2"))
.withValueMap(new ValueMap()
.withString(":v_attrib1", attrib1Value)
.withString(":v_attrib2", attrib2Value))
.withMaxResultSize(1) // to only bring the latest one
.withConsistentRead(true) // is this wrong?
.withScanIndexForward(false); // what about this one?
我不知道maven库版本是否会干扰,但无论如何我使用的版本是1.11.76(我知道有很多新版本,但如果这是我们将更新它的问题。)
提前谢谢大家。
答案 0 :(得分:0)
在搜索了相当一段时间和其他一些测试后,我终于发现问题不在DynamoDB索引中,它们按预期工作,但在Lambda函数中。
我一个接一个地发送大量请求的事实并没有让索引有时间保持更新:Lambda函数异步执行(我应该知道),因此数据库收到的请求没有被命令我的数据没有正确更新。因此,我们将实现更改为使用原子计数器:无论请求的数量或顺序如何,我们都可以保持数据更新。