Amazon dynamodb 单客户端写操作在DynamoDB或Riak中是强排序的吗?

Amazon dynamodb 单客户端写操作在DynamoDB或Riak中是强排序的吗?,amazon-dynamodb,riak,eventual-consistency,Amazon Dynamodb,Riak,Eventual Consistency,我有一个客户机,它按顺序执行以下两个操作: 创建键为“ABC123”的新项 更新项目“newestKey”以包含值“ABC123” 同时,第二个客户端正在运行以下程序: 阅读项目“newestKey”以获取最新项目的密钥K 阅读项目K 第二个客户端是否可能获取“ABC123”作为“newestKey”,但在尝试加载项“ABC123”时收到未找到的错误,因为该项尚未通过数据库传播 换句话说,是否可以保证,如果一个客户端对数据库进行两次写入,那么任何客户端都不会看到第二次写入,除非它也看到第一次写入

我有一个客户机,它按顺序执行以下两个操作:

  • 创建键为“ABC123”的新项
  • 更新项目“newestKey”以包含值“ABC123”
  • 同时,第二个客户端正在运行以下程序:

  • 阅读项目“newestKey”以获取最新项目的密钥K
  • 阅读项目K
  • 第二个客户端是否可能获取“ABC123”作为“newestKey”,但在尝试加载项“ABC123”时收到未找到的错误,因为该项尚未通过数据库传播


    换句话说,是否可以保证,如果一个客户端对数据库进行两次写入,那么任何客户端都不会看到第二次写入,除非它也看到第一次写入?

    DynamoDB,尽管它的名称,并不是基于激发Riak的Dynamo白皮书,所以我无法回答这部分问题

    对于Riak,由于其优先考虑可用性而不是一致性,因此保证相对较少。由于发生了网络分区,因此客户端可能始终能够读取包含密钥“ABC123”的对象(我们称之为“INDEX123”),但可能无法访问具有“ABC123”密钥/值对的服务器

    撇开网络严重受损或服务器出现故障的情况不谈,如果以下情况属实,我想不出客户端可以从“INDEX123”中读取密钥“ABC123”,但找不到密钥/值对“ABC123”的情况:

    • 由“ABC123”表示的键/值对是新的(而不是对具有相同键的旧对象的更新)
    • 所有操作(如W、R和DW)上的请求参数的默认值为2(假设N=3)
    • 您描述的两个操作都是成功的
    考虑到这些情况,下面的示例说明了服务器故障如何阻止客户机找到新的密钥/值对“ABC123”,但只是暂时的

  • 密钥/值对“ABC123”仅成功写入到它应该驻留的主服务器中的两个。第三台服务器接收并确认写入,但由于磁盘故障或其他暂时性故障,它不会将值写入永久存储器
  • 包含密钥/值对的两台服务器中有一台出现故障
  • 客户机请求密钥/值对,第一个响应该请求的服务器是最初未能写入密钥/值对的服务器和承担步骤2中失败的服务器角色的故障转移服务器
  • 此时,客户机将被告知不存在此类数据项,但是,Riak将在从具有副本的服务器接收到密钥/值对后,将其推送到不存在副本的服务器,并且任何未来的客户机请求都会找到它


    此修复操作称为“读取修复”。Riak还有一个主动的反熵机制,可以主动识别丢失/不一致的数据项并修复它们。

    不清楚你在问什么;键和值之间没有任何关系Brian,对于我的回答,我假设步骤1是创建一个新的键/值对,步骤2是更新一个引用它的索引对象。@BrianRoach它们都是写入数据库的。我想知道写入是否可以重新排序。我重写了我的问题;现在有意义了吗?所以,如果我不希望我的应用程序在临时分区期间崩溃,那么我不应该在我的应用程序逻辑中假设“ABC123”仍然存在。好的,谢谢您的帮助。@BrianGordon Correct,出于健壮性的原因,最好设计您的应用程序来处理找不到数据的可能性(与任何其他数据库都不一样)。