ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dapr v1.17 配置 API(HTTP)性能基准实测解读:Get 与 Subscribe 的吞吐、延迟数据与源码验证

Dapr v1.17 配置 API(HTTP)性能基准实测解读:Get 与 Subscribe 的吞吐、延迟数据与源码验证 Dapr v1.17 配置 APIHTTP性能基准实测解读Get 与 Subscribe 的吞吐、延迟数据与源码验证【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/daprDapr Configuration API 为分布式应用提供跨服务共享配置的读取Get与变更订阅Subscribe能力。本文基于仓库中 Dapr v1.17 版本性能报告 tests/perf/report/charts/v1.17.0/configuration/http/README.md 的官方实测结果逐项解读 HTTP 传输层上配置 Get 与 Subscribe 的吞吐、分位延迟、成功率等关键指标并结合 tests/perf/configuration 下的压测代码与 tests/apps/configurationapp 测试应用源码说明这些数字是如何测出来、由什么环节决定帮助你在容量规划、性能回归与阈值设定时准确引用这批数据。一、报告概览HTTP 配置 API 的两组核心数据v1.17 的 HTTP 配置 API 性能报告覆盖两个测试用例全部以 Kubernetes 为运行环境测试全程0 次 Pod 重启、100% 成功率用例吞吐iterations/sec关键延迟请求/事件总数成功率Configuration Get (HTTP)23,326p50:8.27 msp90:18.29 msp95:23.14 ms210,368 次请求100%Configuration Subscribe (HTTP)981p50:268 msp95:473 ms9,313 次订阅检查/事件100%两组数字的含义截然不同需要分开解读Get 是同步读操作每次 iteration 就是一次完整的配置读取往返报告统计的是每秒处理多少笔完整读操作。超过 23,000 次/秒的读取吞吐配合稳定的 8.27 ms 中位数说明 HTTP Get 路径在常见负载下具备很强的线性处理能力。Subscribe 是事件驱动的等待型操作每个 iteration 记录的是客户端从发起订阅到收到配置变更通知的完整等待时间因此它的吞吐量级981 次/秒与延迟量级p95 ≈ 473 ms天然与 Get 不同延迟主要由配置存储侧的变更检测机制轮询间隔主导而非 Dapr 自身处理耗时。指标口径说明本报告所属的 v1.17 总报告 tests/perf/report/charts/v1.17.0/README.md 中明确p50 表示一半请求快于该值典型用户体验p90/p95 表示九成/九成五请求快于该值持续负载下的普遍体验。报告中iterations/sec对 Get 与 Subscribe 有不同定义读操作数 vs 订阅检查数引用时需注意区分。二、测试是如何组织的环境、压测工具与判定阈值要正确使用这批数字需要先还原测试的搭建方式这些都记录在 tests/perf/configuration/configuration_test.go 中。2.1 测试应用与部署形态测试使用专用应用configurationapp源码见 tests/apps/configurationapp/app.go通过 Go 测试的TestMain在 Kubernetes 集群上部署应用镜像名perf-configuration副本数 1开启 Ingress 与 Metrics资源限制Dapr sidecar 与应用各分配 200Mi 内存上限、100Mi 内存请求见 configuration_test.go健康检查测试启动前用HTTPGetNTimes轮询 60 次确认端点可用numHealthChecks 60。2.2 k6 压测脚本与负载模型负载由 k6 生成脚本见 tests/perf/configuration/test.js。其负载模型采用ramping-vus阶梯递增虚拟用户scenarios: { configGet: { executor: ramping-vus, startVUs: 0, stages: [ { duration: 2s, target: 100 }, { duration: 3s, target: 300 }, { duration: 4s, target: 500 }, ], gracefulRampDown: 0s, }, },即 2 秒内爬升至 100 个并发虚拟用户VU、3 秒内到 300、4 秒内到 500随后立即回落。也就是说报告中 23,326 iterations/sec 的吞吐峰值是在最高 500 个并发客户端压测场景下测量到的。脚本同时内置了两条通过判定规则test.jsthresholds: { checks: [rate1], // 所有请求必须通过状态码检查2xx即 100% 成功率 http_req_duration: [avg httpReqDurationThreshold], // 平均延迟必须低于阈值 },checks: [rate1]对应报告中的100% success rate——压测期间每一个响应都必须落在 2xx 区间平均延迟阈值HTTP_REQ_DURATION_THRESHOLD由 Go 测试通过环境变量注入。2.3 Baseline基线对比设计分离 Dapr 开销测试的关键方法论是baseline vs Dapr 双路径对比同一套请求分别打向直接访问配置存储baseline与经 Dapr sidecardapr两个路径两者相减即为 Dapr 引入的净开销。在 configuration_test.go 的TestConfigurationGetHTTPPerformance中可见完整流程调用/initialize-updater初始化配置存储写入器支持 Redis 与 PostgreSQL 两种后端通过/update/add向存储预置key1 val1先跑 baseline/get/baseline/http再跑 dapr/get/dapr/http由printLatencyL138-L173计算两者 p95/平均延迟之差并采集应用与 sidecar 的 CPU、内存、重启次数写入汇总。Subscribe 用例TestConfigurationSubscribeHTTPPerformanceL251-L272的流程则完整覆盖订阅生命周期通过/subscribe/{test}/{protocol}订阅key1拿到subscriptionIDk6 持续向/update/true发起更新请求触发配置变更应用收到通知后测试用/get-received-updates/{subscriptionID}核对事件确实送达最后通过/unsubscribe/...清理订阅subscribeTest 实现见 L100-L136。2.4 判定阈值为何是 60ms 与 450ms测试中为三个场景分别设定了通过阈值configuration_test.go L36-L42defaultConfigGetThresholdMs 60 defaultConfigSubscribeHTTPThresholdMs 450 // HTTP subscribe makes per-key HTTP round-trips, resulting in higher latency than GRPC streaming defaultConfigSubscribeGRPCThresholdMs 350 // GRPC subscribe uses streaming源码注释直接解释了 HTTP Subscribe 阈值450ms为何显著高于 gRPC350msHTTP 订阅路径按 key 进行 HTTP 往返per-key HTTP round-trips而不是像 gRPC 那样走流式streaming通道。这与报告中 Subscribe 的实测 p95 ≈ 473ms 相互印证——该延迟来自订阅通知的送达机制本身而不是 Dapr 处理配置读取的计算开销。三、Configuration GetHTTP23,326 次/秒背后的协议成本与调用链3.1 数据逐项解读报告给出 HTTP Get 的完整画像吞吐 23,326 iterations/sec在最高 500 并发 VU 下每秒完成超过 2.3 万次配置读取p50 8.27 ms半数请求在 8 毫秒出头的水平完成是典型请求的体验基线p90 18.29 ms、p95 23.14 ms即使是最慢的 5% 请求也稳定在 24ms 以内尾部延迟分布紧凑210,368 次总请求、100% 成功率全程无一失败。报告同时给出了与 gRPC 路径的对照数据来自同版本总报告 tests/perf/report/charts/v1.17.0/configuration/README.md传输协议吞吐p50p90p95总请求HTTP23,326 iter/sec8.27 ms18.29 ms23.14 ms210,368gRPC26,810 iter/sec6.67 ms16.35 ms21.53 ms241,601HTTP 吞吐约为 gRPC 的 87%延迟各分位也略高。报告将这一差距归因于HTTP/1.1 协议开销与 gRPC 基于 HTTP/2 的二进制帧相比HTTP/1.1 需要额外的头部解析与文本协议处理。对多数业务而言这一差距p50 差约 1.6ms在可接受范围内但若你的服务是极致延迟敏感型配置读取报告中 gRPC 数据可作为选型依据。3.2 底层调用链一次 HTTP Get 实际做了什么测试应用configurationapp的getHTTP函数app.go L293-L306揭示了请求的真实形态url : daprConfigurationURL configStore buildQueryParams(keys) resp, err : httpClient.Get(url)其中daprConfigurationURL http://localhost:3500/v1.0/configuration/buildQueryParamsL353-L362将 key 列表拼成?keykey1keykey2...形式。也就是说每次 iteration 的完整链路是k6 VU ──HTTP──▶ configurationapp 容器内 localhost:3500Dapr sidecar HTTP 端口 └──▶ Dapr Configuration API: GET /v1.0/configuration/{storeName}?key... └──▶ 读取底层配置存储Redis / PostgreSQL该链路与配置项结构Item{Value, Version, Metadata}app.go L78-L82一一对应Get 返回的正是带版本号与元数据的配置条目集合。这意味着报告的 8.27ms 中位数已经包含了一次应用→sidecar→配置存储→返回的完整服务网格式往返而非单纯的存储读耗时。四、Configuration SubscribeHTTP981 次/秒的通知等待如何度量4.1 数据逐项解读Subscribe 的指标口径与 Get 完全不同——它度量的是客户端等待一次配置变更通知的时间981 iterations/sec每秒完成约 981 次订阅检查每次检查 客户端等待收到变更通知p50 268 ms、p95 473 ms一半通知在 268ms 内送达95% 在 473ms 内送达9,313 次订阅事件全部正确接收100% 投递成功率测试通过/get-received-updates/{subscriptionID}逐一核对事件确实被应用收到参见 app.go L580-L593。4.2 延迟的真正来源配置存储的变更检测机制报告原文明确强调了一个容易被误读的点Subscribe 的 ~470ms p95 由配置存储的轮询间隔驱动而非 Dapr。这与 gRPC Subscribe 路径p95 ≈ 510.58msDapr 净开销仅 1.82ms即0.36%表现一致说明无论走哪条传输通道通知延迟的上限都由存储侧决定。从测试应用源码可以还原变更通知的两种后端实现Redis 后端RedisUpdater通过MSET写入value||version拼接值app.go L95-L125订阅端需要轮询检测变更轮询周期直接决定通知延迟的下限PostgreSQL 后端PostgresUpdater在配置表上创建触发器通过pg_notify向config通道推送 JSON 变更事件app.go L147-L184属于事件推送机制但仍受存储侧通知链路调度影响。因此如果你在自建环境复现 Subscribe 性能应当把关注点放在配置存储的轮询/通知参数上要优化通知延迟调整的是存储侧配置而不是 Dapr。4.3 HTTP Subscribe 的技术路径subscribeHTTPapp.go L436-L464展示 HTTP 订阅的调用方式url : daprConfigurationURL configStore /subscribe buildQueryParams(keys) // 例如: GET http://localhost:3500/v1.0/configuration/{store}/subscribe?keykey1订阅成功后返回subscriptionID后续通过GET /v1.0/configuration/{store}/{id}/unsubscribe退订unsubscribeHTTPL496-L517变更回调由configurationUpdateHandler接收并记录L558-L577。结合 2.4 节源码注释可知HTTP 订阅对每个 key 做独立的 HTTP 往返这正是它相对 gRPC 流式订阅吞吐更低981 vs 968 的量级接近但机制不同、单次事件等待更分散的原因。值得注意的是本报告中 HTTP Subscribe981 iter/sec与 gRPC Subscribe968 iter/sec的吞吐量级非常接近说明在等待通知这一场景下传输协议对吞吐的边际影响有限瓶颈同样在存储侧。五、图表速览读懂每张性能图本报告目录 tests/perf/report/charts/v1.17.0/configuration/http 下为两个测试各生成 8 张图表共 16 张每张图聚焦一个维度。这些图表由 tests/perf/report 下的报告生成器如 k6_charts.go、resource_charts.go自动产出README 中的图片列表由 readme.go 按测试名分组写入。各图含义如下图表文件后缀展示内容_summary.png测试结果汇总关键指标总览_throughput.png吞吐随时间的曲线_tail_latency.png尾部延迟分布p90/p95/p99 等_duration_breakdown.png耗时构成分解_duration_low.png低延迟区间的放大视图_resource_cpu.png/_resource_memory.png应用与 sidecar 的 CPU / 内存占用_data_volume.png压测期间数据量统计以 Get 用例的吞吐曲线为例可以直观看到 VU 从 100 → 300 → 500 阶梯爬升过程中吞吐的响应曲线Subscribe 用例的汇总图则集中呈现事件投递的延迟分布与成功率报告原始 README 使用img标签引用图片因文件名含下划线Markdown 图片语法渲染不佳文章此处按仓库相对路径重新引用图片均位于tests/perf/report/charts/v1.17.0/configuration/http/目录下。六、如何正确引用与复现这批数据6.1 引用时的注意事项区分两种吞吐口径Get 的 iterations/sec 是每秒完成读操作数Subscribe 的是每秒完成的订阅检查数两者不可直接比较Subscribe 延迟别算到 Dapr 头上p95 ≈ 473ms 由配置存储轮询/通知机制决定Dapr 侧开销极小gRPC 路径实测仅 0.36%HTTP vs gRPC 差距集中在 GetGet 场景下 HTTP 因 HTTP/1.1 协议开销比 gRPC 低约 13% 吞吐、中位数高约 1.6msSubscribe 场景两者量级接近成功率口径100% 成功率对应 k6checks: [rate1]与http_req_duration avg 阈值双重条件同时满足且全程 0 Pod 重启。6.2 复现路径复现这批数据的完整素材都在仓库内压测脚本tests/perf/configuration/test.jsk6 ramping-vus 负载模型 阈值断言压测驱动tests/perf/configuration/configuration_test.gobaseline/dapr 双路径对比、阈值注入、资源采集被测应用tests/apps/configurationapp/app.goRedis/PostgreSQL 双后端配置存储、订阅生命周期管理部署清单tests/apps/configurationapp/service.yaml配置存储组件示例tests/config/dapr_redis_configuration.yaml、tests/config/dapr_postgres_configuration.yaml报告生成器tests/perf/report含 readme.go 等图表/README 生成逻辑。若需横向对比其他 API 或传输协议在 v1.17 的表现可查阅总报告 tests/perf/report/charts/v1.17.0/README.md含百分比位数定义、QPS 口径、Dapr 开销定义等阅读指南及各 API 子目录actors、pubsub、state、service_invocation、workflows。七、小结Dapr v1.17 的 HTTP 配置 API 表现出两个鲜明的性能特征Get 路径高吞吐、低延迟23,326 次/秒、p50 8.27ms、p95 23.14ms、21 万次请求零失败Subscribe 路径的延迟由配置存储主导而非 Dapr 自身p95 ≈ 473ms与存储轮询间隔一致。对开发者而言这份报告的价值在于为配置读取服务的容量规划提供 HTTP 传输层的实测基线为订阅场景的性能优化指明正确方向调存储侧而非 Dapr并为后续版本的性能回归提供可复现的测试方法baseline 对比、k6 阈值断言、资源采集一体化的 tests/perf/configuration 工程。【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表