动手
前面九部分读的是 sqlx 的源码。这一部分反过来,不用 sqlx,直接对着 Postgres 的线协议写一个客户端:只用 tokio、bytes、sha2、hmac、pbkdf2、base64、rand,类型只认 text 和 int8,池只有一个信号量和一个 Vec。写完之后在同一个实验库上用 sqlx 跑同样的查询,比较结果;再让两边都经过一次查询的全过程里的代理,比较线上的消息。
- 写一个迷你 Postgres 客户端:四个文件约 560 行。消息的切分照「类型字节加长度」;SCRAM-SHA-256 两个来回,最后校验服务端签名;简单查询收文本,扩展查询把
Parse/Bind/Execute/Sync一次写出、收二进制int8;ErrorResponse之后读到ReadyForQuery连接照常可用;池用tokio::sync::Semaphore限数、Drop里同步归还。七行结果和 sqlx 0.9.0 相同;线上少了Describe那个来回,取消到一半的查询会让连接错位一条回应,迷你版靠丢掉连接、sqlx 靠计数读掉。
flowchart TB wire["消息切分 wire"] --> conn["启动和 SCRAM"] conn --> simple["简单查询"] conn --> ext["扩展查询"] simple --> pool["信号量连接池"] ext --> pool pool --> cmp["与 sqlx 对照"]
💬 关联讨论
发起讨论加载中...