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

Multiple Operations on Multiple Sets (Tables) in Aerospike cluster

当前系统状态:

目前,我在 RESTful 服务支持的 aerospike 命名空间(数据库,相当于 RDBMS)中维护三组(表,相当于 RDBMS)。

用例:

我想根据我系统中的一些批量输入对至少一个集合执行 CRUD 操作,有时最多对所有集合执行 CRUD 操作。

期望:

我想以原子方式执行所有这些 CRUD 操作(意味着要么全部发生,要么none。这还包含一个边缘情况,其中一些集合已成功更新它们各自的最新的更新,后来甚至一个集合都不成功。我想在每个集合中将我的数据回滚到以前的状态。)

我的解决方法:

  1. 首先我试图找到 InsertOnSubmit in aerospike to use the approaches explained on this answer of Whosebug 的等价物,但似乎不存在。
  2. 其次,我想到了创建一个中间回滚工作流模块。伪代码如下所示:

    1. 暂时将新数据保存在一些数据类型中,按集合隔离。
    2. 遍历集合数据,从中选择主键,从 aerospike 获取旧数据并将其保存到其他数据类型中,再次按集合隔离。
    3. 从第一个数据类型开始逐个循环遍历所有集合,并相应地开始执行 CRUD 操作。 IF[everything runs till the end]: GOTO step 6; ELSE: GOTO step 4.
    4. 通过从第二种数据类型开始逐个遍历所有集合开始回滚,并开始执行 CRUD 操作。 IF[everything runs till the end]: GOTO step 7; ELSE: GOTO step 5.
    5. 记录错误,包括所有详细信息,并将此错误报告给警报系统。有人会被传呼给它看一看。 GO TO step 7;
    6. 终止,操作成功。
    7. 终止,操作失败。

需要帮助:

  1. 是否有机会在不创建我自己的回滚工作流的情况下在 Aerospike 集群上整合 InsertOnSubmit 行为?
  2. 如果没有,那有没有更好的方法来优化我的第二种方法?

1 - 否。Aerospike 仅在单个记录级别提供原子性。在插入主记录然后将其副本复制到另一个节点时,确实遵循 Aerospike 的强一致性 (SC) 模式中真正的两阶段提交语义,任何多记录事务都必须在应用程序级别实现。

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