ARC 1先看见共享状态第 1–4 章

第 4 章 —— 从本地提交到远端可见

本章目标: 本章完成后,开发者能够运行双节点复制实验,并用事件来源证明远端可见发生在本地提交之后。

学习目标

  1. 连接两个 membership 并为两端注册相同 spec。
  2. 跟踪 local put、delta 和 remote apply。
  3. 用等待条件代替固定 sleep 验证最终可见。
  4. 说明进程内双节点测试的证据边界。

前置条件

案例进度

网关节点 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) 既可能太短导致偶发失败,也可能掩盖复制已经异常缓慢。

让事件说明来源

ChangeStreamChangeOrigin.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:受控双节点协议集成测试
本实验未证明 跨进程网络、丢包修复、生产发现和线性一致

回顾

下一步

第 5 章回到 Register 本身,建立 put、get、all、remove 和本地可见性的完整契约。

证据链接