Dapr v1.17 Configuration API 性能基准实测:Get 吞吐与 Subscribe 延迟全景解读
2026/9/12 11:14:28 网站建设 项目流程

Dapr v1.17 Configuration API 性能基准实测: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/dapr

Dapr(Distributed Application Runtime)的 Configuration API 为应用提供跨云与边缘的配置读取与变更订阅能力。本文基于当前仓库中 Dapr v1.17.0 的官方性能基准报告 tests/perf/report/charts/v1.17.0/configuration/README.md,完整解读 Configuration API 在 HTTP 与 gRPC 两种协议下的 Get(读取)与 Subscribe(订阅)实测数据,并结合 性能测试用例源码 与 k6 压测脚本 还原测试方法与指标口径。读完本文,你将理解这份报告的每一项数字代表什么、Dapr 在配置读写路径上的真实开销占比,以及如何复现并自行解读同类性能基准结果。

报告概览:v1.17 的核心结论

v1.17 的 Configuration API 基准测试围绕两个核心能力展开:

  • Get 操作:面向高频读场景,验证 Dapr 在"应用 → Dapr sidecar → 配置存储"完整链路上能支撑多高的读取吞吐;
  • Subscribe 操作:面向事件驱动场景,验证配置变更时订阅客户端能多快收到通知,以及 Dapr 在通知投递路径上新增了多少开销。

报告给出的总体结论是:Configuration API 在 v1.17 中能够以高吞吐处理 Get 操作,同时为 Subscribe 增加的开销极小;所有测试运行均达到 100% 成功率,且全程零 Pod 重启。这一结论与测试用例中内置的硬性阈值(Get 平均延迟低于 60ms、Subscribe 延迟低于 350~450ms)相互印证,说明 Dapr 在配置读写路径上的性能表现稳定且可预期。

如何阅读这份报告:指标口径说明

报告中反复出现的两个核心指标容易混淆,文档给出了明确口径:

  • Get 测试的 "Iterations/sec"(每秒迭代次数):指系统在所有并发客户端上每秒完成的完整读操作数,即端到端的读吞吐;
  • Subscribe 测试的 "Iterations/sec":指每秒完成的订阅检查次数——每次检查对应一个订阅客户端等待接收一次配置变更通知的完整过程;
  • 约 500ms 的 Subscribe 延迟:由配置存储的轮询间隔(polling interval)决定,而非 Dapr 引入的延迟

理解这一口径是正确解读后续所有数字的前提:Subscribe 场景测的是"从存储变更到客户端收到通知"的全链路等待时间,其中存储自身的更新频率占绝对主导。

Configuration Get 实测:gRPC 与 HTTP 双协议吞吐与延迟

gRPC:26,810 次/秒吞吐,p95 仅 21.53ms

报告记录的 gRPC Configuration Get 数据如下:

指标数值
吞吐量26,810 iterations/sec
p506.67 ms
p9016.35 ms
p9521.53 ms
总请求数241,601
成功率100%

gRPC 路径下 Configuration Get API 每秒处理超过 26,000 次读取,典型请求(中位数)在 6.67ms 内完成。在累计 241,601 次请求中,没有一次失败,系统在整个测试期间保持稳定。p95 为 21.53ms 表明即便是较慢的请求也完成得非常快,尾部延迟可控。

HTTP:23,326 次/秒吞吐,p50 8.27ms

HTTP 协议的 Configuration Get 数据如下:

指标数值
吞吐量23,326 iterations/sec
p508.27 ms
p9018.29 ms
p9523.14 ms
总请求数210,368
成功率100%

HTTP 配置读取同样快速,中位延迟 8.27ms,p95 控制在 24ms 以内。相比 gRPC,吞吐量略低(23,326 vs 26,810 次/秒),报告中明确将这一差距归因于HTTP/1.1 协议本身的额外开销,而非 Dapr 处理逻辑的差异。

源码印证:测试如何定义与断言 Get 性能

Get 性能阈值定义在 tests/perf/configuration/configuration_test.go 的常量区:

defaultConfigGetThresholdMs = 60

测试流程为:先向测试应用发出initialize-updater初始化配置更新器,随后向配置存储写入key1,再分别以baseline(直连存储)dapr(经由 Dapr sidecar)两种目标 URL 运行 k6 压测,最后通过printLatency计算 Dapr 相对基线的延迟增幅。目标 URL 形态可见 configuration_test.go:

targetURL := fmt.Sprintf("http://%s/get/baseline/http", externalURL) // 基线 targetURL = fmt.Sprintf("http://%s/get/dapr/http", externalURL) // 经 Dapr

源码印证:应用侧如何调用 Get

测试应用 tests/apps/configurationapp/app.go 展示了两种协议的真实调用方式:

  • HTTP:请求http://localhost:3500/v1.0/configuration/{store}?key=k1&key=k2,通过buildQueryParams拼接多 key 查询参数;
  • gRPC:调用DaprClient.GetConfiguration,传入GetConfigurationRequest{StoreName, Keys}

daprConfigurationURLStable = "http://localhost:3500/v1.0/configuration/"即为 Dapr sidecar 的标准 HTTP 配置 API 入口,这也是 Get 测试 6~8ms 级延迟的实测端到端链路。

Configuration Subscribe 实测:延迟由存储轮询决定,Dapr 开销近乎为零

gRPC:+0.36% 开销,等效零额外延迟

报告记录的 gRPC Subscribe 数据:

指标数值
吞吐量968 iterations/sec
p50274 ms
p95510.58 ms
相对基线开销+1.82ms(+0.36%)
订阅检查次数9,225
成功率100%

Subscribe 是事件驱动的:测试度量的是订阅客户端在配置变更发生后,等待收到通知所经历的时间。约 500ms 的 p95 由配置存储的轮询间隔主导,Dapr 自身只额外增加了 1.82ms(+0.36%)——在订阅型工作负载下,这个增幅实质上是零开销。报告中强调:"你看到的延迟来自底层存储的更新频率,而非 Dapr。"

HTTP:981 次/秒,投递延迟与 gRPC 一致

指标数值
吞吐量981 iterations/sec
p50268 ms
p95473.20 ms
订阅检查次数9,313
成功率100%

HTTP Subscribe 展现出与 gRPC 一致的通知投递特性:每秒 981 次订阅检查,投递延迟稳定,全部 9,313 个订阅事件均被正确接收。与 gRPC 路径相同,延迟主要由配置存储的轮询间隔贡献,而非 Dapr 的处理耗时。

源码印证:Subscribe 测试的完整流程

Subscribe 测试逻辑位于 configuration_test.go 的subscribeTest函数,完整覆盖"订阅 → 更新 → 收通知 → 退订"闭环:

  1. /subscribe/{test}/{protocol}发起订阅请求(携带 key 列表["key1"]),获得subscriptionID
  2. /update/true发起配置更新(payload 为{"key1":{"value":"val1"}});
  3. 运行 k6 压测度量通知等待时间;
  4. 最后通过/unsubscribe/{subscriptionID}/{test}/{protocol}退订清理。

其中 HTTP 与 gRPC 的订阅延迟阈值分别定义为:

defaultConfigSubscribeHTTPThresholdMs = 450 // HTTP 订阅按 key 逐个 HTTP 往返,延迟高于 gRPC 流式 defaultConfigSubscribeGRPCThresholdMs = 350 // gRPC 订阅使用流式

这组阈值本身即印证了报告中的观察:HTTP 订阅因按 key 执行 HTTP 往返而延迟略高,gRPC 订阅则受益于流式传输

源码印证:应用侧的订阅实现差异

tests/apps/configurationapp/app.go 中的实现细节进一步解释了两种协议的开销差异:

  • HTTP 订阅subscribeHTTP请求{store}/subscribe?key=k1&key=k2,每个订阅 key 对应独立 HTTP 连接管理;
  • gRPC 订阅subscribeGRPC调用SubscribeConfiguration建立双向流,subscribeHandlerGRPC在独立 goroutine 中持续Recv()接收变更,通过context.WithCancel支持退订——这正是 gRPC 路径延迟更低的底层原因。

压测是如何运行的:k6 场景与执行参数

负载注入由 k6 脚本 tests/perf/configuration/test.js 完成,其核心场景配置:

scenarios: { configGet: { executor: 'ramping-vus', startVUs: 0, stages: [ { duration: '2s', target: 100 }, // 2 秒内爬升到 100 VU { duration: '3s', target: 300 }, // 3 秒内爬升到 300 VU { duration: '4s', target: 500 }, // 4 秒内爬升到 500 VU ], gracefulRampDown: '0s', }, }, thresholds: { checks: ['rate==1'], // 检查必须 100% 通过 http_req_duration: ['avg<' + httpReqDurationThreshold], // 平均延迟低于阈值 },

测试采用**阶梯爬升虚拟用户(ramping-vus)**模式,从 0 逐步爬升至 500 并发,同时断言:

  • 所有响应检查(response code was 2xx)通过率必须为 100%;
  • 平均请求延迟必须低于HTTP_REQ_DURATION_THRESHOLD(由 Go 测试侧传入 60/350/450ms 阈值)。

每个 k6 迭代都记录完整的延迟分布(p50/p90/p95)与吞吐数据,报告中的 summary、throughput、tail_latency 等图表即来源于此。

测试驱动与资源指标采集

Go 侧通过runk6test组装并执行压测,测试应用部署参数定义在 configuration_test.go:单副本、启用 Dapr sidecar、Dapr 内存限制 200Mi/请求 100Mi。测试完成后printLatency计算 Dapr 相对基线的 p95 与平均延迟增幅,并采集应用与 sidecar 的 CPU、内存占用及重启次数——报告中"零 Pod 重启"结论正是来自GetTotalRestarts的采集结果。

测试环境:Redis 配置存储组件

本报告的 Get 与 Subscribe 测试基于 Redis 配置存储,其组件定义见 tests/config/dapr_redis_configuration.yaml:

apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: configstore spec: type: configuration.redis version: v1 metadata: - name: redisHost value: dapr-redis-master.dapr-tests.svc.cluster.local:6379 - name: redisPassword value: "" - name: redisDB value: "0" scopes: - configurationapp

测试应用中 RedisUpdater 直接以MSET命令写入配置存储(值以||拼接 value 与 version),用于模拟配置变更,而 Dapr 侧则通过configuration.redis组件与同一存储交互——这一"直连存储(baseline)vs 经 Dapr"的双路径设计,正是精确量化 Dapr 开销的前提。

报告图表体系:8 类指标视图一览

报告为每个测试用例生成 8 类指标图(完整图表位于 http 目录 与 grpc 目录),各图对应的分析视角:

图表分析视角
summary用例总体结果:成功率、失败率、虚拟用户数、总迭代次数
throughput每秒迭代数随时间的变化曲线,观察吞吐峰值与稳定性
tail_latency尾部延迟(p90/p95 等)分布,评估极端延迟风险
duration_low低延迟区间分布,观察典型请求耗时集中度
duration_breakdown延迟分段占比分解,定位耗时构成
data_volume测试期间的数据量(请求/响应字节)变化
resource_cpu应用与 sidecar 的 CPU 占用
resource_memory应用与 sidecar 的内存占用

以 Get 场景的 summary 图为例(gRPC 与 HTTP 各一),二者均呈现100% 成功率、0% 失败率,虚拟用户数爬升至约 500 后保持稳定,与报告文字结论完全对应:

结论与启发

综合 v1.17 的这份基准报告,可以得到三条对生产选型有直接参考价值的结论:

  1. Get 路径性能充裕:无论 gRPC(26,810 次/秒)还是 HTTP(23,326 次/秒),Configuration Get 都能以个位数毫秒级 p50 支撑高并发读取,且 100% 成功率意味着该 API 在 500 并发下仍无压力;
  2. Subscribe 开销可忽略:Dapr 在订阅通知路径上仅增加约 0.36% 延迟,实际等待时间由底层配置存储的轮询间隔决定——优化订阅延迟应首先着眼于存储侧更新频率,而非 Dapr;
  3. 协议选择有依据:gRPC 在 Get(吞吐更高)与 Subscribe(流式传输、延迟更低)两个维度均优于 HTTP,对延迟敏感的配置密集型应用可优先选用 gRPC 协议接入。

如需复现或深入分析,可直接基于 测试用例、k6 脚本 与 测试应用 在具备 Redis/Postgres 配置存储的集群环境中运行,并参考 性能测试运行指南 了解完整的执行与数据采集流程。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询