
把请求从地域 A 转发到地域 B,是路由;让 A 中的 Actor 状态、进行中的流式输出和外部写入安全地延续到 B,是另外一组协议。两者不能用“多活”两个字合并掉。
Ray GCS 容错文档描述的是集群控制状态恢复。它不提供任意业务状态的跨地域事务。跨地域部署更适合先明确独立集群的边界,再在应用层定义请求身份与恢复行为。
重试之前判断还能不能执行
请求应携带业务 ID、租户 ID、截止时间和尝试编号。网关只对允许重试且尚有时间预算的操作重试;写操作的幂等约束应落在实际提交端。流式响应已经发出部分内容后,透明重试还可能让客户端收到拼接结果,必须定义新的恢复语义。

两个地域是独立服务域;路由重试不表示 Ray Actor 状态自动跨地域迁移。
下面演示同一业务 ID 的重复提交,以及过期请求。内存字典只用于说明契约,不具备跨进程一致性,也不能用于生产去重。
results = {}
def commit(tenant, request_id, deadline, now, value):
key = (tenant, request_id)
if key in results:
return "replayed", results[key]
if now >= deadline:
return "expired", None
results[key] = value
return "committed", value
assert commit("t1","r1",10,1,"ok") == ("committed","ok")
assert commit("t1","r1",10,2,"duplicate") == ("replayed","ok")
assert commit("t1","r2",10,10,"late") == ("expired",None)
print("commit, replay and deadline checks passed")
运行输出:
commit, replay and deadline checks passed
状态在哪里,故障域就在哪里
若两个地域都依赖同一个同步状态库,库的故障可能让两边一起失效。若各自独立写入,又需要解决冲突和读后写一致性。选型应从业务允许的重复、丢失和延迟窗口出发,而非先选一个全球复制开关。
10 月的多轮 Agent KV 复用分析还说明缓存位置和会话元数据会影响下一轮计算。缓存丢失通常可重算,业务交易丢失则不是同一种代价,应分开恢复。
本文仅验证 CPU 幂等教学逻辑,未运行 Go 网关、跨地域网络或 Ray。真正的故障演练应包括地域隔离、迟到响应、重复写入和回切抖动,并报告客户端观察到的行为。
本文探讨跨地域推理路由中租户幂等性、请求截止时间控制及故障回切机制的设计边界。强调路由转发与状态延续是两个正交问题,指出重试需基于业务ID、租户ID、截止时间和尝试编号进行前置判断;幂等性应由提交端保障;跨地域状态同步不可依赖全局一致存储,而需按业务容忍度权衡重复、丢失与延迟。分析了状态驻留位置对故障域的影响,并指出真实演练需覆盖地域隔离、迟到响应、重复写入和回切抖动。

1209

被折叠的 条评论
为什么被折叠?



