ARC 1先看见共享状态第 1–4 章
第 4 章 —— 从本地提交到远端可见
本章目标: 本章完成后,开发者能够运行双节点复制实验,并用事件来源证明远端可见发生在本地提交之后。
学习目标
- 连接两个 membership 并为两端注册相同 spec。
- 跟踪 local put、delta 和 remote apply。
- 用等待条件代替固定
sleep验证最终可见。 - 说明进程内双节点测试的证据边界。
前置条件
- 已完成第 2—3 章。
- 能区分 locator、entry key 和 schema。
案例进度
网关节点 A 发布 fulfillment-primary;节点 B 在自己的
Register 中最终读到相同地址。订单业务事实仍未进入 DSM。
从本地提交到远端应用
两端需要相同的集群/服务通信域、相同的集合 locator、兼容 schema,并让
sync service 把集合挂到路由表。顺序很重要:本地 put
可以先返回,远端稍后才处理 REMOTE_DELTA。
registerA.put(new RouteHint("fulfillment-primary", metadata, "10.0.0.8:8080"));
await(() -> registerB.get("fulfillment-primary").isPresent(), 2_000);
assertEquals("10.0.0.8:8080",
registerB.get("fulfillment-primary").orElseThrow().address());等待条件表达实际验收目标。固定 Thread.sleep(500)
既可能太短导致偶发失败,也可能掩盖复制已经异常缓慢。
让事件说明来源
ChangeStream 的 ChangeOrigin.REMOTE_DELTA
能区分远端应用与本地写入。测试同时断言可见值和来源,比只轮询
get 更接近协议事实。但 ChangeStream
不是持久消息日志;订阅者离线期间的完整历史不能靠它保证。
反例与故障注入
只在节点 A 注册集合,或让节点 B 使用不同
schemaId。此时「membership
已连接」不代表数据会被正确应用。复制路径包含集合路由与 schema
检查,任何一环缺失都应显式暴露,而不是把超时归咎于「最终一致就是慢」。
实验
运行聚焦双节点测试:
cd submodule/dsm
mvn -q -pl dsm-integration-test -am \
-Dtest=TwoNodeIntegrationTest#runtimeFirstRegisterDeltasReplicateAcrossTwoNodes \
-Dsurefire.failIfNoSpecifiedTests=false test该测试覆盖 A→B put、A→B remove 和 B→A put,并断言远端事件来源。
实验验收卡
| 字段 | 内容 |
|---|---|
| 运行命令 | 上述 TwoNodeIntegrationTest 聚焦命令 |
| 输入或故障 | 两个 fake membership 节点;双向写入和删除 |
| 可观察结果 | 对端在 2 秒条件窗口内可见;事件为 REMOTE_DELTA |
| 证据等级 | E3:受控双节点协议集成测试 |
| 本实验未证明 | 跨进程网络、丢包修复、生产发现和线性一致 |
回顾
- 本地提交与远端可见是两个时刻。
- 相同 membership 还不够,集合路由和 schema 也需要匹配。
- 最终条件应通过轮询目标状态验证,不使用拍脑袋
sleep。 REMOTE_DELTA证明在线传播来源,但不提供事件日志保证。
下一步
第 5 章回到 Register 本身,建立 put、get、all、remove 和本地可见性的完整契约。