我有下一个表结构:
ID string `dynamodbav:"id,omitempty"`
Type string `dynamodbav:"type,omitempty"`
Value string `dynamodbav:"value,omitempty"`
Token string `dynamodbav:"token,omitempty"`
Status int `dynamodbav:"status,omitempty"`
ActionID string `dynamodbav:"action_id,omitempty"`
CreatedAt time.Time `dynamodbav:"created_at,omitempty"`
UpdatedAt time.Time `dynamodbav:"updated_at,omitempty"`
ValidationToken string `dynamodbav:"validation_token,omitempty"`
我有2个针对Value(ValueIndex)和Token(TokenIndex)字段的全局二级索引。稍后在内部逻辑中的某个地方,我执行该实体的更新,并通过其中一个索引(ValueIndex或TokenIndex)立即读取该实体,并且看到预期的问题,即数据尚未准备就绪(我的意思是尚未更新)。在这种情况下,我不能使用ConsistentRead,因为这是全局二级索引,它不支持此选项。结果,我无法在此逻辑上运行负载测试,因为在10-20-30个线程中进行测试时,数据尚未准备就绪。所以我的问题-是否可以在某个地方解决这个问题?还是应该重新组织我的表并将其拆分为2-3个不同的表,然后将诸如Value,Token的文件移动到HASH密钥或SORT密钥?
最佳答案
GSI从它们正在索引的表中异步更新。 GSI的更新通常发生在一秒钟之内。因此,如果您在插入/更新/删除后立即读取GSI,那么就有可能获取过时的数据。这就是GSI的工作方式-您无能为力。但是,您需要真正注意三件事:
调整完DynamoDB设置后,您仍然绝对无法处理GSI的短暂延迟,您可能需要使用其他技术。例如,即使您决定将表拆分为多个表,也会产生相同(甚至更糟)的影响。您将更新一个表,然后尝试从另一个表读取数据,但尚未将值插入到另一个表中。
我怀疑一旦针对您的情况调整了DynamoDB,您就会非常接近您想要的东西。
关于amazon-web-services - DynamoDB ConsistentRead用于全局索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47032502/