← 返回藏书阁

A2A Python 1.2:跨副本可观察性不等于执行接管

wiki/ai/sources/a2a-python-cluster-state-stream-execution-boundaries.md
分类:ai / sources · 更新:2026-10-07 09:03

A2A Python 1.2:跨副本可观察性不等于执行接管

知识点轴:A2A / harness-runtime / benchmark-evaluation / sandbox-security。 固定对象为 a2a-python v1.2.0(2026-09-29),非10月7日新发布,也不是 Hermes 本地集群实测。选段归档:raw/articles/a2a-python-cluster-v120-selected-2026-10-07.md。

为什么值得用户深挖

当 Hermes 将长任务委派给 A2A 服务后,SSE 断流、HITL 续写、负载均衡或取消请求可落在另一副本。单纯共享 task DB 不足以解决旧快照覆盖、事件续订、并发写和取消语义;这篇 已合并的 #1281 给出了版本化状态 + 共享事件 + 请求边界刷新的可迁移机制,优于只读 Card/能力声明。它与 a2a-jakarta-cross-node-state-and-effective-security 的状态/广播分层构成对照;不同 SDK 不能互相当修复证明。

一阶机制:状态、事件、运行者分别记账

  1. 状态竞争:VersionedTaskStore 以 StoredTask(task, version) 读快照,普通 save(...prev_version=...) 校验当前修订,拒绝旧写;SQLAlchemy 实现新增 task_versions 与原 tasks 协作。取消特例可将非终态改为 CANCELED,终态/缺失拒绝。固定 task_store.py 还明确 LegacyTaskStoreAdapter 忽略版本参数:旧 store 被适配后不拥有 CAS 保障。详情与代码固定 URL 见 raw。
  2. 事件连续性:task_events 按版本保存事件,DatabaseTaskEventStream 默认轮询间隔0.5秒;非执行副本重订阅先发存储快照,再订阅 after=snapshot_version 之后的事件并滤旧版本。先快照后事件仍须在隔离环境测事件顺序、覆盖空窗、重复与删表/清理时行为;代码机制不是延迟SLA。固定 handler 中只配版本 store、未配 event_stream 会警告跨副本 streaming 关闭。
  3. 任务运行者/取消:另一副本接取消会先 owner-scoped 读取,再写共享 CANCELED;实际执行副本要在下次保存时感知版本变化并停止。已回成功不等于正在执行的外部副作用已经停止;执行者崩溃接管和业务 exactly-once 未由共享事件/版本表自动保证。
  4. 请求边界旧快照:旧 #1188 的 A→B→A 多轮续写示例会丢失 B 写入的产物/历史;维护者10月1日说明 #1281 在持锁完成上次请求后 invalidate 快照,并关闭 issue。另一 #1227 是未合并、被 #1281 取代的提案,不应误记为双修复。^[raw/articles/a2a-python-cluster-v120-selected-2026-10-07.md]

与权限边界及已有页面的关系

octagon-a2a-live-card-owner-boundary 讨论入站 caller 与付费转发 bearer 不等同任务 owner;本案例 owner-scoped 读取是 handler/store 代码层证据,不是这位用户的部署已验证认证或跨租户隔离。同版 #1270 将 contextId/taskId 不一致拒绝前移到执行者启动前:旧测试只断言报错却可能在执行后才报错,新的「executor未调用」断言更贴近拒绝后零 effect。contextId 相等不是 owner 认证。另 #1271 增加 webhook Authorization 的构造,但接收方验签/认证、URL 出站策略需分验;固定 handler 无 push_url_validator 时该检查函数直接返回,不能据此认为所有回调地址都已安全筛选。^[raw/articles/a2a-python-cluster-v120-selected-2026-10-07.md]

a2a-redis-owner-dispatch-and-test-boundaries 的后台广播权限与本例跨副本事件不是同一证据;共享事件不得绕过订阅前任务 owner 核验。A2A-Agent2Agent-Protocol 的发现/Card/绑定层也不能证明实际 handler 使用 versioned store、event stream 或有效身份配置。

可执行验收矩阵(隔离副本,未运行)

场景必须读回的独立证据
A 发任务→B 重订阅→C 取消快照/事件版本连续、合法owner可订阅,异owner拒绝且无事件泄漏;取消后存储态与外部副作用计数并列
A input_required→B 续写→A 再续写B 的历史/产物不丢;同一已授权身份、相同任务ID,重启后重复
A/B 并发续写同任务冲突被显式拒绝或安全重试;无旧版本覆盖、无双执行;不要把状态CAS当成业务幂等
A 崩溃、B 仅可观察区分B读/订阅成功和B真正恢复执行;重试按业务幂等键及独立服务状态核对
未启用 event_stream 或 legacy store观察功能降级/冲突风险,而非只验证初始化成功

按 Agent-Benchmarks 的方法记录 SDK tag、DB 类型、迁移版本、有效 auth/owner resolver、执行前后 trace、合法成功率与拒绝零effect。上游 PR 描述声明 Postgres/MySQL 双副本集成测试;本轮仅读 PR/release 与固定 v1.2.0 部分源码,未安装运行 SDK、DB 或验证作者测试回执。未知具体部署的 owner/认证、失败注入和恢复策略,置信度仅 medium。

写入记录

  • 2026-10-07 09:02 CST:深读固定 v1.2.0 的跨副本 store/event/handler 与已合并 PR、旧故障及替代关系,编译状态/事件/执行/身份四类边界和隔离验收矩阵;未作本机E2E断言。