Aerospike 集群中多个集合(表)的多个操作
Multiple Operations on Multiple Sets (Tables) in Aerospike cluster
当前系统状态:
目前,我在 RESTful 服务支持的 aerospike 命名空间(数据库,相当于 RDBMS)中维护三组(表,相当于 RDBMS)。
用例:
我想根据我系统中的一些批量输入对至少一个集合执行 CRUD 操作,有时最多对所有集合执行 CRUD 操作。
期望:
我想以原子方式执行所有这些 CRUD 操作(意味着要么全部发生,要么none。这还包含一个边缘情况,其中一些集合已成功更新它们各自的最新的更新,后来甚至一个集合都不成功。我想在每个集合中将我的数据回滚到以前的状态。)
我的解决方法:
- 首先我试图找到 InsertOnSubmit in aerospike to use the approaches explained on this answer of Whosebug 的等价物,但似乎不存在。
其次,我想到了创建一个中间回滚工作流模块。伪代码如下所示:
- 暂时将新数据保存在一些数据类型中,按集合隔离。
- 遍历集合数据,从中选择主键,从 aerospike 获取旧数据并将其保存到其他数据类型中,再次按集合隔离。
- 从第一个数据类型开始逐个循环遍历所有集合,并相应地开始执行 CRUD 操作。
IF[everything runs till the end]: GOTO step 6; ELSE: GOTO step 4
.
- 通过从第二种数据类型开始逐个遍历所有集合开始回滚,并开始执行 CRUD 操作。
IF[everything runs till the end]: GOTO step 7; ELSE: GOTO step 5
.
- 记录错误,包括所有详细信息,并将此错误报告给警报系统。有人会被传呼给它看一看。
GO TO step 7;
- 终止,操作成功。
- 终止,操作失败。
需要帮助:
- 是否有机会在不创建我自己的回滚工作流的情况下在 Aerospike 集群上整合
InsertOnSubmit
行为?
- 如果没有,那有没有更好的方法来优化我的第二种方法?
1 - 否。Aerospike 仅在单个记录级别提供原子性。在插入主记录然后将其副本复制到另一个节点时,确实遵循 Aerospike 的强一致性 (SC) 模式中真正的两阶段提交语义,任何多记录事务都必须在应用程序级别实现。
2 - 任何实现多记录事务的方案,例如您正在考虑的方案,通常涉及 - 在您设置的记录中创建某种 "lock" bin,进行多记录更新,建立数据的前后状态,有某种最大的完成时间,以便您可以回滚和清除放弃的操作并由客户端应用程序锁定。这些方案中的任何一个都只能在 Aerospike 的强一致性模式下可靠地工作。
当前系统状态:
目前,我在 RESTful 服务支持的 aerospike 命名空间(数据库,相当于 RDBMS)中维护三组(表,相当于 RDBMS)。
用例:
我想根据我系统中的一些批量输入对至少一个集合执行 CRUD 操作,有时最多对所有集合执行 CRUD 操作。
期望:
我想以原子方式执行所有这些 CRUD 操作(意味着要么全部发生,要么none。这还包含一个边缘情况,其中一些集合已成功更新它们各自的最新的更新,后来甚至一个集合都不成功。我想在每个集合中将我的数据回滚到以前的状态。)
我的解决方法:
- 首先我试图找到 InsertOnSubmit in aerospike to use the approaches explained on this answer of Whosebug 的等价物,但似乎不存在。
其次,我想到了创建一个中间回滚工作流模块。伪代码如下所示:
- 暂时将新数据保存在一些数据类型中,按集合隔离。
- 遍历集合数据,从中选择主键,从 aerospike 获取旧数据并将其保存到其他数据类型中,再次按集合隔离。
- 从第一个数据类型开始逐个循环遍历所有集合,并相应地开始执行 CRUD 操作。
IF[everything runs till the end]: GOTO step 6; ELSE: GOTO step 4
. - 通过从第二种数据类型开始逐个遍历所有集合开始回滚,并开始执行 CRUD 操作。
IF[everything runs till the end]: GOTO step 7; ELSE: GOTO step 5
. - 记录错误,包括所有详细信息,并将此错误报告给警报系统。有人会被传呼给它看一看。
GO TO step 7;
- 终止,操作成功。
- 终止,操作失败。
需要帮助:
- 是否有机会在不创建我自己的回滚工作流的情况下在 Aerospike 集群上整合
InsertOnSubmit
行为? - 如果没有,那有没有更好的方法来优化我的第二种方法?
1 - 否。Aerospike 仅在单个记录级别提供原子性。在插入主记录然后将其副本复制到另一个节点时,确实遵循 Aerospike 的强一致性 (SC) 模式中真正的两阶段提交语义,任何多记录事务都必须在应用程序级别实现。
2 - 任何实现多记录事务的方案,例如您正在考虑的方案,通常涉及 - 在您设置的记录中创建某种 "lock" bin,进行多记录更新,建立数据的前后状态,有某种最大的完成时间,以便您可以回滚和清除放弃的操作并由客户端应用程序锁定。这些方案中的任何一个都只能在 Aerospike 的强一致性模式下可靠地工作。