Hazelcast CPMap 与 TransactionalMap 如何选择?
结论
需要在网络分区期间保持键值操作的线性一致性时,选择 CPMap;需要将多项 Map 操作放在同一事务中统一提交或回滚时,考虑 TransactionalMap,但要接受其隔离级别和故障保证的限制。
支持事务并不自动意味着满足 CAP 中的 CP。CPMap 的单次操作具有强一致性,连续调用多个操作也不构成事务。
原问题没有指定 Hazelcast 版本。以下具体行为以官方 5.7 文档为依据,使用时应核对所部署的版本。
ACID 与 CAP 中的 C 有什么区别?
ACID 的 Consistency 关注事务是否保持业务规则和数据约束,例如一次状态变更是否满足应用定义的不变量。事务机制本身不会替应用补齐这些规则。Hazelcast 术语表
在 CAP 语境下,CPMap 提供的保证是线性一致性:每次成功操作都可以看作在调用开始与返回之间的某个瞬间生效,操作顺序尊重真实时间。如果一次写入已经成功返回,随后开始的读取就不能返回该写入之前的旧值,除非期间又发生了其他写入。
CPMap 所属的 CP Group 使用 Raft,由多数成员达成一致。网络分区后,无法联系该组多数成员的一侧不能继续成功处理操作。这是为了保持一致性而付出的可用性代价。CP Subsystem 文档
为什么提交、回滚和只读已提交数据还不够?
这些机制分别处理不同的问题:
- 提交与回滚决定一组修改是否生效。
- 只读取已提交数据用于避免脏读,属于隔离性的范围。
- 线性一致性还要求成功操作遵循统一且符合真实时间的顺序,包括网络分区时的行为。
例如,在没有其他写入的前提下,客户端读到的值即使来自已提交事务,也可能已经过时。因此,“读到的是已提交数据”不足以证明“读到的是符合线性一致性的最新数据”。
Hazelcast 还有具体限制:事务文档将隔离级别描述为单个数据分区范围内的 READ_COMMITTED。跨多个数据分区时,事务外的读取者可能短暂看到部分提交结果。文档还指出,发生 split-brain 或成员故障时,ACID 保证不一定始终成立。事务保证与限制
这里的数据分区指数据分片,与网络分区造成的通信中断是不同的概念。
TWO_PHASE 为什么也不能代替 CPMap?
TWO_PHASE 通过准备和提交阶段协调事务,并复制提交日志,以便发起成员故障后由其他成员继续完成提交。这改善了事务提交的故障恢复能力,但不会把底层 Map 的复制机制变成 Raft,也不会额外提供线性一致性。事务类型说明
发生异常也不一定意味着所有修改都已撤销。异常可能出现在提交过程中,不能仅凭客户端收到异常就断定事务结果,应结合事务状态和故障类型处理。
实际应该怎样选择和使用?
- 先明确操作范围:是针对单个 key 做条件更新,还是组合修改多个 key。
- 再明确故障要求:网络分区时,业务是否允许为维持一致性而停止服务。
- 核对事务隔离、跨分片可见性,以及版本和配置限制。
单个 key 需要强一致的条件更新
使用 CPMap.compareAndSet() 进行条件更新,避免把独立的 get() 和 put() 当成原子读改写。以下 Java 片段假设 hazelcastInstance 已连接到正确启用 CP Subsystem 且具备相应授权的集群:
CPMap<String, String> states =
hazelcastInstance.getCPSubsystem().getMap("workflow-states");
states.putIfAbsent("job-42", "PENDING");
boolean changed = states.compareAndSet(
"job-42", "PENDING", "RUNNING");
changed 为 true 表示此次条件更新成功。两个独立的 CPMap 调用之间仍可能穿插其他客户端的操作。官方列出的原子操作包括 compareAndSet、putIfAbsent 等,但这不意味着支持多 key 事务。5.7 文档还要求 Enterprise Edition、相应授权,并明确 CPMap 没有 unsafe 模式。CPMap 文档
多项修改需要统一提交或回滚
通过 TransactionContext 获取 TransactionalMap,在同一事务上下文中操作,并按结果提交或回滚。需要先读后写并锁定条目时,可以考虑 getForUpdate();它不能消除前述跨分片和故障限制。事务 API 使用说明
如果需求同时包含“多 key 原子事务”和“网络分区下的强一致性”,应单独验证系统是否完整提供这两项保证。仅选择 TransactionalMap,或连续执行多个 CPMap 操作,都不足以满足这一组合要求。
备注:内容仅供参考。
