网易首页 > 网易号 > 正文 申请入驻

Claude Code和Cursor抢活时,SQLite凭什么只让一个赢

0
分享至

上周我发布了一个小工具叫coord。它是个本地守护进程,让并行的AI编程助手——Claude Code、Cursor、Codex,可以同时运行——通过一块共享布告栏来协调工作。整个产品就一个Rust二进制文件,MIT协议,状态存在单个SQLite文件里。

有意思的是不是这个守护进程本身,而是它底层的原语:当N个代理同时伸手抢同一份工作时,必须且只能有一个胜出。没有队列,没有Actor系统,没有分布式锁。就一个SQLite UPDATE,外加一层薄薄的Rust包装。


这篇文章讲的是这个原语长什么样,以及我怎么说服自己它是正确的——包括那个证明它能扛住16个独立操作系统进程、通过真实HTTP猛砸同一个守护进程的测试。

想象这个场景:你开了两个AI编程标签页并排跑。它们往共享布告栏里贴任务:bug报告、确认通知、"请接手这个"。两个标签页每轮都会扫描布告栏。有时候,两个标签页在同一瞬间看到同一个待处理的bug。如果没有协调原语,两个都会伸手去抢,两个都写修复,两个都推不同的提交。合并冲突算是最便宜的失败模式;更糟的是"两个标签页在跑昂贵的并行工作,其实只需要一个"这种沉默的浪费。

coord的工作就是让其中一个标签页成为认领的赢家,然后告诉另一个"你输了,挑别的"。确定性,而非乐观主义。

大多数工程师的第一个想法是"在RPC调用后面塞个Mutex>"。单进程内确实能跑。但它跨不过进程边界——而这套系统的核心就在于代理是不同的进程(不同的IDE插件、不同的语言运行时,有时候甚至是同一台回环地址上的不同机器)。

第二个想法是队列(Redis、RabbitMQ、NATS)。队列确实能解决争抢问题,但带来一堆包袱:运维复杂度、外部依赖、配置地狱。对于一个想brew install就能跑的工具来说,太重了。

第三个想法是分布式锁(比如Redis SETNX、Postgres advisory locks)。更接近了,但本质上是个每开发者笔记本电脑的工具,却要多搭一套基础设施。

对于一个想要brew install就能跑的工具来说,正确的原语是最小的那个能干活的家伙。SQLite已经住在守护进程二进制里了。SQLite已经串行化写了。问题变成"让SQLite告诉我,我赢了没有"。

这就是整个认领函数:

pub fn claim_task(&self, id: Uuid, agent_id: &str) -> Result> {
let now = Utc::now();
let conn = self.conn.lock();
let updated = conn.execute(
"UPDATE tasks SET state = 'claimed', claimed_by = ?1, updated_at = ?2
WHERE id = ?3 AND state = 'pending'",
params![agent_id, now.to_rfc3339(), id.to_string()],
)?;
if updated == 0 {
Ok(None) // 有人抢先了
} else {
// 重新读取,拿到权威行数据,包括赢家信息
Ok(Some(conn.query_row(
"SELECT * FROM tasks WHERE id = ?1",
params![id.to_string()],
Task::from_row
)?))
}
}

关键点在WHERE state = 'pending'。SQLite的ACID保证这个UPDATE是原子的。如果返回的affected_rows是1,你赢了;如果是0,别人在你读到写的间隙里抢先了。没有轮询,没有重试循环,没有分布式共识算法。就一个UPDATE语句告诉你结果。

但"感觉正确"不等于"正确"。我需要证据。

我写了integration_claim_race.rs。它启动coord守护进程,然后fork出16个独立进程。每个进程通过真实HTTP向同一个本地端口发claim请求,争同一个任务ID。测试跑完断言:恰好一个进程拿到Some(task),其余15个拿到None。

这个测试在CI里跑,在M1 Mac上跑,在GitHub Actions的Linux容器里跑。它证明了SQLite的串行化写确实能跨进程边界生效——即使16个客户端通过TCP同时砸过来,数据库层面的原子性依然成立。

有人可能会说"这只是个乐观锁,高并发下会大量冲突"。但这不是乐观锁。乐观锁是先读再写再检查版本号;这是"原子比较并交换",数据库帮你做了互斥。冲突只发生在真正的并发写同一行时,而且失败方立即知道,不用等提交才发现。

也有人会说"SQLite不是为并发设计的"。单文件模式下确实如此。但coord用的是WAL模式(Write-Ahead Logging),读不阻塞读,读不阻塞写,写之间串行化。对于"一个开发者笔记本上的守护进程"这个场景,吞吐量完全够用。

这个原语的优雅之处在于它的不可扩展性。它不会变成分布式锁服务,不会支持跨机器协调,不会加入Raft协议。它就是"同一台机器上的N个进程抢一个任务",用最少的代码解决最具体的问题。

coord现在就在我的日常开发里跑着。Claude Code和Cursor同时扫描同一个代码库,看到同一个TODO,只有一个会认领。没有合并冲突,没有重复劳动。200行Rust,一个SQLite文件,仅此而已。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
苦等13年!深圳巨无霸城中村旧改规划公示,周边房价要变天

苦等13年!深圳巨无霸城中村旧改规划公示,周边房价要变天

童童聊娱乐啊
2026-05-08 14:16:35
60岁张卫健晒19岁旧照,同款姿势引回忆杀,网友:帅到犯规

60岁张卫健晒19岁旧照,同款姿势引回忆杀,网友:帅到犯规

木子娱你同行
2026-05-09 09:25:23
举报一个查一个!耿同学举报3位大学院长和教授,同济院长被免职还差南开和中山

举报一个查一个!耿同学举报3位大学院长和教授,同济院长被免职还差南开和中山

可达鸭面面观
2026-05-07 13:03:19
广东绝杀赢球后杜锋却犯浑了?或激怒周琦赵睿:11冠王G3战危险了

广东绝杀赢球后杜锋却犯浑了?或激怒周琦赵睿:11冠王G3战危险了

篮球快餐车
2026-05-10 01:55:47
于和伟这回玩大了!白发小辫配黑伞,谁看了不喊一声“大佬”?

于和伟这回玩大了!白发小辫配黑伞,谁看了不喊一声“大佬”?

可乐谈情感
2026-05-10 05:24:11
虎父无犬女!曹德旺女儿罕见现身,不与哥哥争家产,不是美国国籍

虎父无犬女!曹德旺女儿罕见现身,不与哥哥争家产,不是美国国籍

白面书誏
2026-05-09 14:49:29
国产“新伟哥”!效力是西地那非8倍,副作用却更少

国产“新伟哥”!效力是西地那非8倍,副作用却更少

鬼菜生活
2026-05-09 11:20:07
太可怕!印度女局长深夜便衣上街,3小时被40名男性轮番冒犯

太可怕!印度女局长深夜便衣上街,3小时被40名男性轮番冒犯

傲傲讲历史
2026-05-10 04:40:19
今年寒酸的红场阅兵,给了朝鲜方队24秒特写,镜头透出阵阵杀气

今年寒酸的红场阅兵,给了朝鲜方队24秒特写,镜头透出阵阵杀气

史料布籍
2026-05-09 19:08:56
浙江高速上,男子开着“辅助驾驶”直接睡着,因长时间无操作,系统自动退出,停在第一车道,后方车辆紧急避让,最终被罚款400元记 9分

浙江高速上,男子开着“辅助驾驶”直接睡着,因长时间无操作,系统自动退出,停在第一车道,后方车辆紧急避让,最终被罚款400元记 9分

台州交通广播
2026-05-09 14:20:34
重磅定调!国防部直接摊牌,流传多年的海峡中线正式成为历史

重磅定调!国防部直接摊牌,流传多年的海峡中线正式成为历史

荆楚寰宇文枢
2026-05-09 23:12:06
陈若仪晒和Kimi合照庆母亲节,公开13年前龅牙照坦言不敢公开社群

陈若仪晒和Kimi合照庆母亲节,公开13年前龅牙照坦言不敢公开社群

手工制作阿歼
2026-05-10 04:32:17
官僚主义最阴狠的套路:把所有风险,砸向最底层

官僚主义最阴狠的套路:把所有风险,砸向最底层

职场资深秘书
2026-05-08 20:44:41
坚决反对穆里尼奥回归!皇马传奇态度鲜明:皇马应该请回阿隆索

坚决反对穆里尼奥回归!皇马传奇态度鲜明:皇马应该请回阿隆索

夜白侃球
2026-05-09 10:16:15
理想新车突然官宣:5月15日,全新上市

理想新车突然官宣:5月15日,全新上市

科技堡垒
2026-05-08 11:10:56
丑鞋出海卖爆了,卖家狂赚400万

丑鞋出海卖爆了,卖家狂赚400万

跨境派Pro
2026-05-09 14:14:21
森林北回应分手传闻:我和汪峰现在挺好的,如果分手会告知大家

森林北回应分手传闻:我和汪峰现在挺好的,如果分手会告知大家

叨唠
2026-05-09 23:57:24
内幕,名记透露马德鲁加离队真因,被贵宾点名,以为他是少数民族

内幕,名记透露马德鲁加离队真因,被贵宾点名,以为他是少数民族

体坛风之子
2026-05-10 07:03:51
前国手张继科直播表示:我这没湿巾,你们拿毛巾蘸水擦一下就行

前国手张继科直播表示:我这没湿巾,你们拿毛巾蘸水擦一下就行

凤幻洋
2026-05-09 15:49:48
乌克兰击沉里海舰队导弹舰!摧毁全俄最大的两座炼油厂

乌克兰击沉里海舰队导弹舰!摧毁全俄最大的两座炼油厂

项鹏飞
2026-05-08 19:30:06
2026-05-10 09:48:49
薛定谔的BUG
薛定谔的BUG
有态度网友ytd
2388文章数 41关注度
往期回顾 全部

科技要闻

DeepSeek融资,改写所有人的估值

头条要闻

牛弹琴:74岁法国政坛老将对华清醒表态 让人刮目相看

头条要闻

牛弹琴:74岁法国政坛老将对华清醒表态 让人刮目相看

体育要闻

成立128年后,这支升班马首夺顶级联赛冠军

娱乐要闻

50岁赵薇脸颊凹陷沧桑得认不出!

财经要闻

白酒大逃杀

汽车要闻

轴距加长/智驾拉满 阿维塔07L定位大五座SUV

态度原创

教育
亲子
本地
公开课
军事航空

教育要闻

只需5步!手把手教你用一本书撬动整个资源盘!

亲子要闻

自己就给自己确诊了!

本地新闻

用苏绣的方式,打开江西婺源

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

美伊突然再次交火 伊朗外长:战争准备程度是1000%

无障碍浏览 进入关怀版