Rust in Everything
基于 sqlx 0.9.0

动手

前面九部分读的是 sqlx 的源码。这一部分反过来,不用 sqlx,直接对着 Postgres 的线协议写一个客户端:只用 tokio、bytes、sha2、hmac、pbkdf2、base64、rand,类型只认 text 和 int8,池只有一个信号量和一个 Vec。写完之后在同一个实验库上用 sqlx 跑同样的查询,比较结果;再让两边都经过一次查询的全过程里的代理,比较线上的消息。

  1. 写一个迷你 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 对照"]

💬 关联讨论

发起讨论
加载中...