ci: build production-like RPC performance matrix - #13
Merged
Merged
Conversation
Owner
Author
CI 阻塞修复已完成验证最新提交: 验证运行:CI #41 / 34835453911
保留并完整执行原有 15 场景,未删除协议/序列化器/真实 Nacos/tc 网络用例。 本轮修复包含:每个 HTTP/2/gRPC stream 独立失败处理、gRPC 消息头/大消息跨 DATA 帧重组、等待成功 grpc-status 尾帧、Nacos 消费端对当前 provider 的有界可见性检查、benchmark 错误日志配置。相关回归测试已在本轮单元测试中通过。 性能历史仍使用 docs/PERFORMANCE.md;本次 PR 没有执行 main 自动回写,也没有合并本 PR。 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
目标与基线
以
gRPC + 真实 Nacos 2.5.4 Docker + Protobuf + 1 KiB + tc LAN为默认性能场景。Local Registry 仅作对照;长期记录仍使用docs/PERFORMANCE.md,没有恢复性能 artifact 或 Actions Summary 作为长期记录。15 个场景(全部保留)
每个场景分配独立 RPC 端口(预留范围
19091–19120),而不是复用 19090。tc 使用端口过滤塑形 RPC 数据流,不把 Nacos 控制面作为本轮网络故障注入目标。本轮修复的 CI 阻塞问题
HTTP/2 / gRPC 生命周期隔离
之前 child stream 直接挂了共享
NettyRpcClientHandler;某个流正常结束时触发channelInactive -> failAll,使其他在途请求也报ClosedChannelException。新增每流独立
RpcStreamResponseHandler,只路由该流响应/失败。TCP 父连接关闭仍然清理该连接的全部请求。保留之前的 HTTP/2 connection-ready gate。gRPC 分帧与完成条件
之前把一个 HTTP/2 DATA frame 当成一个完整 gRPC 消息,无法正确处理拆分的 5 字节消息头或跨多个 DATA frame 的大消息。
新增有上限的
GrpcMessageAccumulator,支持分片累积、256 KiB 请求/响应,拒绝超限、截断和多余 unary 消息。客户端在收到成功grpc-status尾帧后才完成 Future,不能把单独的 DATA 当作调用成功。Nacos 消费端可见性
Provider 注册成功之后,使用与 RpcClient 相同的 SPI discovery 实例轮询,必须确认发现的是本次 provider 的正确地址/端口。最多等待 30 秒,超时明确失败;不绕过 Nacos,不用 mock,也不把这个等待算入 RPC 延迟。
测试与诊断
新增流完成隔离、RST_STREAM 隔离、父连接关闭、requestId 不匹配、拆分消息头、大消息重组、错误尾帧、长度上限/截断等回归测试。修正原有成功响应测试的非法 DATA END_STREAM 写法,并新增缺失尾帧必须失败的负向测试。
修复 benchmark logback appender 配置,让 ERROR 日志真正可见。弱网下依然不允许响应数据损坏;客户端 metrics 必须与实测成功/失败数量一致。严格场景仍要求全部成功。
验证记录
19d2bb5:Build、RPC Integration、完整 15 场景性能矩阵通过(Scenario failures: 0)。单测发现原有 gRPC 测试没有状态尾帧;因此该轮整体门禁仍失败,不能标记成整套 CI 成功。75070ff已修正旧用例并补上缺失尾帧的负向测试。以该提交最新 Actions 结果为准。测量范围和限制
这是同一 Runner、同一测试 JVM、真实 TCP loopback 上施加 tc 的合成实验,不是跨物理主机或真实公网压测;没有 TLS。当前同一个 netem 队列覆盖两个方向,rate 不能解释为双向各自独享的带宽。
矩阵不是所有配置的笛卡尔积。各场景采样量/并发度有差异,报告会明确列出,因此不能仅按一个 QPS 数字作严格横向排名。P95/P99 仅统计成功请求,小样本不支持尾延迟 SLA 结论。弱网服务端指标是观察区间统计,可能包含前阶段超时后晚到的请求。
仅 main push 且完整门禁成功后自动追加 Markdown;PR 的 Record Performance 跳过是预期行为。PR 保持 open,未合并。