ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Agent 进度合并能用 CRDT,预算扣减也能吗?

Agent 进度合并能用 CRDT,预算扣减也能吗? 两个Agent离线做事重新连上后把各自的进度合起来看起来是个适合CRDT的问题。若它们合并的是“已经处理了多少文件”收敛的计数很有用。把字段换成“还剩一次调用额度”问题就变了。两个副本都看到还剩1各自扣一次重连后账本确实能一致却可能一致地变成负数。副本收敛并不自动保住业务不变量。一个只在本地运行的反例下面用两个按actor分开的单调计数映射保存增量和减量。合并时每个actor各取最大值预算定义为初始1加总增量减总减量。这是教学用状态模型没有实现网络同步、权限控制或生产计数库。use std::collections::BTreeMap; #[derive(Clone, Debug, PartialEq, Eq)] struct Counter { p: BTreeMapstatic str,u64, n: BTreeMapstatic str,u64 } impl Counter { fn new() - Self { Self { p: BTreeMap::new(), n: BTreeMap::new() } } fn spend(mut self, actor: static str) { *self.n.entry(actor).or_default() 1; } fn merge(mut self, other: Self) { for (dst,src) in [(mut self.p,other.p),(mut self.n,other.n)] { for (actor,value) in src { let vdst.entry(actor).or_default(); *v(*v).max(value); } } } fn budget(self) - i128 { 1 self.p.values().map(|v| i128::from(v)).sum::i128() - self.n.values().map(|v| i128::from(v)).sum::i128() } } fn main() { let mut aCounter::new(); let mut bCounter::new(); a.spend(A); b.spend(B); assert_eq!((a.budget(),b.budget()),(0,0)); let mut aba.clone(); ab.merge(b); let mut bab.clone(); ba.merge(a); assert_eq!(ab,ba); assert_eq!(ab.budget(),-1); let beforeab.clone(); ab.merge(before); assert_eq!(ab,before); let mut cCounter::new();c.spend(C); let mut lefta.clone();left.merge(b);left.merge(c); let mut bcb.clone();bc.merge(c); let mut righta;right.merge(bc);assert_eq!(left,right); println!(merge laws: passed on constructed replicas); println!(merged budget: {},ab.budget()); }保存为main.rs运行rustc --edition2024 main.rs -o counter-demo ./counter-demo。本地macOS aarch64、rustc 1.98.0实际输出merge laws: passed on constructed replicas merged budget: -1两个副本单独都得到0合并后得到-1。这个构造例足以否定“用了可收敛计数器就不会超卖”的说法不需要等真实API账单出现。测试中的交换、幂等和结合断言只覆盖这几组输入不是对任意实现的自动形式证明。这里可额外做数学推导单个actor的合并是maxmax满足交换、结合和幂等把它逐项应用到两个映射仍保留这些性质。这个推导也有前提。actor需要独立写入自己的单调分量不能多个离线写者复用同一个actor并覆盖对方的计数。计数溢出、actor身份重用、丢失持久化历史等都需要另设协议本例没有处理。“最后写入”也不是替预算作决定用时间戳选一个最后写入的值可能让界面上只显示一个答案但会把另一次已经发生的消费藏起来。真实外部调用不会因为本地账本选了另一个值而撤销。如果使用LWW结构相同时间戳的不同值还需要确定的平局规则。仅写“时间晚的赢”不足以说明时间一样时怎么收敛。逻辑时钟、唯一actor ID和事件身份也各有用途不能随手拿系统时间拼成正确协议。作者提交的CRDT论文摘要讨论并发操作的可交换性、收敛及局限发表于2009-07-06是这里的基础概念来源不是2026年10月新技术。本次复核读到摘要与元数据本文的max合并与预算反例由上面的明示模型推导不冒充论文完整算法的复现。为不同字段选不同保证进度、已观察事件集合等字段可以先问它们能否接受离线合并。独占额度、仅执行一次的发布动作则应先写出不变量允许多少个执行者同时持有什么权利谁有权批准下一次动作。可选办法包括中心准入、事先分配不可重复的额度或把拒绝过期执行者的校验放在真正消费资源的入口。这些方案各有可用性和复杂度代价不能在短例后宣布一个万能答案。涉及复制日志的语义可参照Raft作者说明也要记住复制同一决定与决定本身是否越权是不同问题。2026-10-07的Copilot本地沙箱公告把工具执行边界作为独立控制项。它可以提醒我们分开考虑模型输出、工具权限和状态记录但不为本文的预算模型提供额外正确性保证。这次小实验没有访问模型或扣费系统。能确定的是算对一份合并后的账不代表此前每次消费都获准。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表