动手
前面各部分读的是 pingora 的源码。这一部分反过来:不依赖 pingora,只用 tokio 和 httparse,把请求主线上最核心的几步自己写一遍,再把同样的 curl 序列和 Rust 客户端分别打到 mini 和 pingora 上,数上游连接、看出错时谁回什么。
- 写一个迷你代理:库 491 行代码。
Filter只有request_filter、upstream_peer、response_filter三个同步方法,短路必须带一个响应;下游每个请求头的读取都有空闲超时,pingora 只有第一个请求有(60 秒),之后没有;body 按 Content-Length、chunked 或读到关闭原样透传,chunk 扩展和 trailer 都留着,pingora 会重新编码、把它们丢掉;请求体和响应体用try_join!同时转发,测试里把它改成先发后收就挂住。同一组请求下两者的上游连接数相同;上游关掉空闲连接后,mini 拿到死连接回 502,pingora 的idle_poll已经把它清掉;上游在请求到达时关连接,pingora 重试 GET 成功,mini 回 502。最后一张表列出 mini 缺的东西和讲它们的页。
flowchart TB flt["Filter 三个阶段"] --> loop["下游循环 空闲超时"] loop --> body["body 原样透传"] body --> duplex["try_join 双向转发"] duplex --> pool["按地址分组的池"] pool --> cmp["和 pingora 跑同一组请求"] cmp --> miss["pingora 多出来的"]
💬 关联讨论
发起讨论加载中...