把它做成生产功能之前,需要先拆开协议事实、产品承诺和运行成本,三者混在一起很容易得到错误结论。 脑裂时两个分区都可能看见本地健康。安全性来自外部仲裁或多数派授权,而不是节点自报;配额、身份撤销等不可合并写入必须由单一授权域处理。
分布式正确性来自幂等键、租约、单调版本和可对账事实,而不是假设请求只到一次。超时代表结果未知,调用方不能未经确认就把它解释成失败。
落地方案的关键部件
实现之前先列出不可违反的不变量,再为性能与体验留出调节参数。参数可以灰度,身份、权限和终态规则不能在运行时随意漂移。
- 列出操作的可合并性:追加日志可带版本后合并,唯一用户名和配额扣减必须多数派,边缘区失去仲裁后进入只读或排队。
- 把协议事实、用户意图和自动恢复分层;自动化只能恢复事实,不能推翻用户明确选择。
- 资源释放是协议的一部分:定时器、句柄、队列和临时数据都要在终态中可重复清理。
“脑裂不是一句“最终一致”:检测、隔离与恢复要逐层设计”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
别让错误假设进入生产
最值得优先排查的是会静默留下错误事实的故障:界面看似恢复,底层队列、权限或计数却已分叉。这类问题通常在下一次动作才暴露。
- 为了可用让两个区域各自签发同一会话所有权,恢复后无法判断哪个取消或权限变更应生效,形成安全回退。
- 刷新或网络切换同时触发两条恢复路径,重复副作用被误当成两次真实用户操作。
- 指标标签直接包含用户或任务标识,既制造高基数成本,也让诊断数据泄露不必要的身份信息。
发布闸门应该检查什么
发布闸门应包含确定性回归、随机时序探索和真实浏览器组合。发现一次失败后保存 seed 与状态轨迹,让它永久成为可重放用例。
- 切断区域互联并分别尝试连接、撤销信任、扣配额和写日志,核对允许矩阵;恢复后验证合并顺序和冲突审计。
- 连续执行一百次开始、失败、重试和取消,检查句柄、监听器、队列及临时数据回到基线。
- 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。
最终结果应同时满足正确性、可恢复性和可解释性。任何一项只能依赖刷新页面或工程师猜测,都说明协议闭环仍不完整。