Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database DynamoDB是否保证在快速更新时收敛到最新数据?_Database_Amazon Dynamodb_Eventual Consistency - Fatal编程技术网

Database DynamoDB是否保证在快速更新时收敛到最新数据?

Database DynamoDB是否保证在快速更新时收敛到最新数据?,database,amazon-dynamodb,eventual-consistency,Database,Amazon Dynamodb,Eventual Consistency,很明显,在并行运行更新/删除时,Dynamo不是线程安全的(除非使用乐观更新锁定或条件写入) 我想知道的是,在不间断地一个接一个地运行更新时,是否存在一致性问题的风险,比如(Javascript): 我已经运行了1000次这段代码,结果表明,在这种情况下,可以依靠Dynamo按预期运行(上次更新/删除获胜),但我想确定一下(文档链接?) 更新:换句话说,我想知道,当更新发生得很快时,Dynamo是否保证遵守我发送更新的顺序。如果你想保证你将读取最新版本的数据,你应该使用强一致性读取。这样,当您进

很明显,在并行运行更新/删除时,Dynamo不是线程安全的(除非使用乐观更新锁定或条件写入)

我想知道的是,在不间断地一个接一个地运行更新时,是否存在一致性问题的风险,比如(Javascript):

我已经运行了1000次这段代码,结果表明,在这种情况下,可以依靠Dynamo按预期运行(上次更新/删除获胜),但我想确定一下(文档链接?)


更新:换句话说,我想知道,当更新发生得很快时,Dynamo是否保证遵守我发送更新的顺序。

如果你想保证你将读取最新版本的数据,你应该使用强一致性读取。这样,当您进行查询时,可以保证读取最新的值


如果使用最终一致性,则可能无法读取最新值(读取过时的概率约为33%)。从经验上看,读取将失效的时间段大约为毫秒,并且随着上次写入时间的延长,失效读取的结果趋于零,但对于最终一致读取达成一致所需的时间,没有具体的SLA。根据经验,任何超过几秒钟的时间都可以,但同样,如果需要强保证,则必须使用强一致性读取。

如果要保证读取的是最新版本的数据,则应使用强一致性读取。这样,当您进行查询时,可以保证读取最新的值


如果使用最终一致性,则可能无法读取最新值(读取过时的概率约为33%)。从经验上看,读取将失效的时间段大约为毫秒,并且随着上次写入时间的延长,失效读取的结果趋于零,但对于最终一致读取达成一致所需的时间,没有具体的SLA。根据经验,任何超过几秒钟的操作都可以,但是,如果您需要强有力的保证,您必须使用强一致性读取。

获得AWS支持部门的响应:

简言之,是的。无论更新速度有多快,最新的更新都会“获胜”。您不会遇到DynamoDB服务认为数据一致但不一致的情况,从而导致长期的过时状态。所有返回HTTP 200成功代码的DynamoDB“写入”类型命令(PutItem、UpdateItem、DeleteItem)都是按顺序处理的。

如果我正确理解StackOverflow上的示例,您将放置一个项目,然后立即删除它。按该顺序运行时,该项目将始终被删除。永远不会出现这样的情况:PutItem在DeleteItem之前发生得太近,而最终导致项目未按预期删除。最终一致性与强一致性仅在读取数据时才值得关注[1]


您可能知道,从DynamoDB表中读取项有两种不同的方式,最终一致(默认)和强一致。

[+]最终一致性读取的成本为一半(例如,4KB项目的成本为0.5RCU),但如果该项目在读取前几秒钟内更新,则可能会返回陈旧数据。 [+]强一致性读取是全部成本(例如,4KB项目使用1个RCU),可能会导致稍高的网络延迟,并将导致以下结果:

  • HTTP 200-如果项目存在,则返回该项目;如果项目不存在,则返回null。无论最近一次Put/Update/Delete在读取之前运行多久,这都是正确的
  • HTTP 500-我们端发生内部网络错误,您需要再次尝试读取(这种情况很少见) 您不会看到返回的是过时数据或最近删除的项目

  • 获得AWS支持部门的回复:

    简言之,是的。无论更新速度有多快,最新的更新都会“获胜”。您不会遇到DynamoDB服务认为数据一致但不一致的情况,从而导致长期的过时状态。所有返回HTTP 200成功代码的DynamoDB“写入”类型命令(PutItem、UpdateItem、DeleteItem)都是按顺序处理的。

    如果我正确理解StackOverflow上的示例,您将放置一个项目,然后立即删除它。按该顺序运行时,该项目将始终被删除。永远不会出现这样的情况:PutItem在DeleteItem之前发生得太近,而最终导致项目未按预期删除。最终一致性与强一致性仅在读取数据时才值得关注[1]


    您可能知道,从DynamoDB表中读取项有两种不同的方式,最终一致(默认)和强一致。

    [+]最终一致性读取的成本为一半(例如,4KB项目的成本为0.5RCU),但如果该项目在读取前几秒钟内更新,则可能会返回陈旧数据。 [+]强一致性读取是全部成本(例如,4KB项目使用1个RCU),可能会导致稍高的网络延迟,并将导致以下结果:

  • HTTP 200-如果项目存在,则返回该项目;如果项目不存在,则返回null。无论最近一次Put/Update/Delete在读取之前运行多久,这都是正确的
  • HTTP 500-我们端发生内部网络错误,您需要再次尝试读取(这种情况很少见) 您不会看到返回的是过时数据或最近删除的项目

  • 这很有帮助,似乎表明我的期望是正确的,引用:“如果您在短时间后重复您的读取请求,响应应该返回最新的数据”。然而,它并没有特别提到一个接一个的快速更新。我在想——也许迪纳摩在做DELET之前需要先在内部阅读
    await dynamo
      .put({ // PUT creates a record if it doesn't exist
        TableName: "table-name",
        Item: {
          id,
          value: "some value"
        }
      })
      .promise();
    await dynamo
      .delete({
        TableName: "table-name",
        Key: {
          id
        }
      })
      .promise();
    
    // wait for X seconds for eventual consistency here
    const result = await dynamo
      .get({
        TableName: "table-name",
        Key: {
          id
        }
      })
      .promise();
    if (result.Item) {
      throw new Error('Oh no, record should have been deleted!');
    }