Java Aerospike集群中多个集合(表)上的多个操作

Java Aerospike集群中多个集合(表)上的多个操作,java,workflow,crud,pseudocode,aerospike,Java,Workflow,Crud,Pseudocode,Aerospike,当前系统状态: 目前,我在由RESTful服务支持的aerospike名称空间(数据库,在RDBMS中等效)中维护三个集合(表,在RDBMS中等效) 用例: 我希望至少在一个集合上执行CRUD操作,有时最多在所有集合上执行CRUD操作,这是基于系统中的一些批量输入 期望值: 我希望以原子方式执行所有这些CRUD操作(意味着要么全部发生,要么不发生。这还包含一种边缘情况,即某些集合使用其各自的最新更新成功更新,之后甚至有一个集合未成功更新。我希望将数据回滚到每个集合中的前一个状态。) 我的解决方法

当前系统状态:

目前,我在由RESTful服务支持的aerospike名称空间(数据库,在RDBMS中等效)中维护三个集合(表,在RDBMS中等效)

用例:

我希望至少在一个集合上执行CRUD操作,有时最多在所有集合上执行CRUD操作,这是基于系统中的一些批量输入

期望值:

我希望以原子方式执行所有这些CRUD操作(意味着要么全部发生,要么不发生。这还包含一种边缘情况,即某些集合使用其各自的最新更新成功更新,之后甚至有一个集合未成功更新。我希望将数据回滚到每个集合中的前一个状态。)

我的解决方法:

  • 首先,我试图找到aerospike中的等效方法来使用上面解释的方法,但似乎不存在
  • 其次,我考虑创建一个中间回滚工作流模块。Psuedo代码如下所示:

  • 临时将新数据保存在某些数据类型隔离的集合中
  • 循环查看set wise数据,从中选择主键,从aerospike中获取较旧的数据,并将其保存到另一种数据类型(再次分离set wise)
  • 从第一个数据类型开始逐个循环所有集合,并相应地开始执行CRUD操作<代码>如果[一切运行到结束]:转到步骤6;否则:转到步骤4
  • 通过从第二个数据类型逐个循环所有集合开始回滚,并开始执行CRUD操作<代码>如果[一切运行到结束]:转到步骤7;否则:转到步骤5
  • 记录错误,包括所有详细信息,并将此错误报告给警报系统。有人会被呼叫去看一看<代码>转至步骤7
  • 终止,操作成功
  • 终止,操作未成功
  • 需要帮助:

  • 在没有创建自己的回滚工作流的情况下,是否有可能在Aerospike群集上无法执行
    InsertOnSubmit
    行为
  • 如果没有,那么有没有更好的方法来优化我的第二种方法
    1-不。Aerospike仅在一个记录级别提供原子性。在Aerospike的强一致性(SC)模式下,插入主记录并将其副本复制到另一个节点时,确实遵循真正的2阶段提交语义,但任何多记录事务都必须在应用程序级别实现


    2-任何实现多记录事务的方案(如您正在考虑的方案)通常涉及-在您设置的记录中创建某种“锁定”箱,执行多记录更新,构建数据的前后状态,有一些最长的时间来完成,这样您就可以回滚和清除放弃的操作,并通过客户端应用程序进行锁定。这些方案中的任何一个都只能在Aerospike的强一致性模式下可靠地工作

    谢谢,@pgupta对您的见解。我有几个简短的问题:1。你说的“主记录”是什么意思?2.我认为aerospike上已经存在“锁定”垃圾箱功能。基于此讨论:。谢谢1) 在Aerospike中,记录分布在4096个分区上。在一个稳定的集群中,每个分区都有
    replication factor
    拷贝。每个分区都有一个“主”副本,负责接收其包含的记录的所有插入/更新。通过“主记录”,pgupta表示主分区(即非只读分区)上存在的记录副本。注意:分区主控形状不是静态的,如果当前主控形状消失,可以升级新的主控形状。但是,根据集群中的节点ID,排序是确定性随机的。2)您提到的锁在单个事务期间锁定单个记录。目前,没有任何用于多记录事务的内置机制,不管是通用的还是其他的。通常,对多记录事务的需求可以建模,但也有一些用法无法建模。在分布式系统中,集群节点之间的协调会带来巨大的性能负担——一般的多记录事务解决方案需要协调。对于扩展,最好是评估您是否可以对此类需求进行建模。所谓锁定bin,我的意思是在多记录事务实现中,您在模型中获取一条记录,并在其中指定一个bin-将其命名为“lockBin”-当某个客户在执行多记录事务时,您输入1,从该记录开始并涉及多个其他记录,然后客户端将其设置回0,释放该记录供其他客户端使用。您正在实现所有这些锁定/释放/释放,如果锁定客户端死亡-所有这些都在应用程序中。Aerospike本机不支持多记录事务。如果不使用强一致性模式,则无法可靠地执行此操作。