十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Dapr v1.17.0 配置 API(Configuration API)gRPC 性能基准深度解析:Get 每秒 2.6 万次读取与 Subscribe 近零开销

Dapr v1.17.0 配置 API(Configuration API)gRPC 性能基准深度解析:Get 每秒 2.6 万次读取与 Subscribe 近零开销 Dapr v1.17.0 配置 APIConfiguration APIgRPC 性能基准深度解析Get 每秒 2.6 万次读取与 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 官方性能测试报告 tests/perf/report/charts/v1.17.0/configuration/grpc/README.md 及其上层汇总报告 tests/perf/report/charts/v1.17.0/configuration/README.md结合仓库内性能测试用例与 gRPC API 源码逐项拆解 Dapr v1.17.0 Configuration API 在 gRPC 协议下的吞吐、延迟与资源表现。读完本文你将掌握如何解读 Dapr 配置读取Get与配置订阅Subscribe的基准数字理解延迟构成中「存储轮询」与「Dapr 自身开销」的边界并能依据仓库内的测试工程自行复现与扩展这套压测。一、核心结论速览v1.17.0 的 Configuration API 在 gRPC 通道上表现出两个鲜明特征Get 操作具备极高的吞吐与极低的确定性延迟而Subscribe 操作对订阅投递链路几乎不增加额外开销。两次测试的全部请求均以100% 成功率完成且全程零 Pod 重启指标Configuration Get (gRPC)Configuration Subscribe (gRPC)吞吐26,810 iterations/sec968 iterations/secp50 延迟6.67 ms274 msp90 延迟16.35 ms—p95 延迟21.53 ms510.58 ms总请求数241,6019,225订阅检查成功率100%100%Dapr 相对基线开销—p95 仅 1.82 ms0.36%两个结论值得展开Get 是典型的高吞吐低延迟路径超过每秒 2.6 万次读取中位数仅 6.67 ms——这一延迟已包含经 Dapr 到配置存储再返回的完整往返。24 万次请求无一失败说明系统在整个压测期间保持稳定。Subscribe 的延迟由存储轮询主导而非 Dapr订阅测试衡量的是「配置变更发生后客户端等待收到变更通知」的耗时。p95 约 510 ms 几乎全部来自配置存储的轮询间隔Dapr 在投递路径上的额外耗时仅 1.82 ms相对基线 0.36%可视为近零开销。报告中为两次 gRPC 压测各生成了一组图表数据量、耗时分解、低延迟区间、CPU、内存、汇总、尾延迟、吞吐下图为 Get 与 Subscribe 两次测试的结果汇总二、如何解读这些数字测试口径说明报告中的统计口径与常见的“纯 API 基准”略有不同理解口径才能正确引用数字iterations/secGet所有并发客户端每秒完成的完整读操作次数。它衡量的是端到端读取能力而非单纯的协议层 RPS。iterations/secSubscribe每秒完成的“订阅检查”次数。每次检查即「客户端等待接收一次配置变更通知」的完整周期因此吞吐天然远低于 Get。p50 / p90 / p95延迟百分位。p95 用于刻画“较慢请求”的尾部表现——Get 的 p95 仅 21.53 ms说明即使是最慢的一批请求也完成得很快。基线对比baseline vs dapr测试对同一操作分别压测“直连配置存储”baseline与“经 Dapr 转发”dapr两条路径两者 p95 之差即Dapr 新增延迟。Subscribe 的 1.82 ms 正是由此得出。作为参照同版本报告中 gRPC 与 HTTP 的对比数据详见 configuration/README.mdHTTP Get 为 23,326 iterations/sec、p50 8.27 ms、p95 23.14 ms、共 210,368 次请求、100% 成功HTTP Subscribe 为 981 iterations/sec、p95 473.20 ms、100% 成功。gRPC Get 吞吐更高26,810 vs 23,326差异主要来自 HTTP/1.1 协议自身的开销。三、压测工程是如何构建的这套性能数据并非孤立的一次性脚本而是仓库内可复现的正式性能测试工程位于 tests/perf/configuration/由 Go 测试驱动、k6 施压、Kubernetes 平台编排。3.1 测试应用与被测端点测试使用专用的configurationapp测试应用见 tests/apps/configurationapp/以单副本部署并启用 Dapr sidecarsidecar 内存限制 200Mi、请求 100Mi见 configuration_test.go。测试应用对外暴露三类业务端点/get/{baseline|dapr}/{http|grpc}读取配置项分别走“直连存储”与“经 Dapr”两条路径/subscribe/{baseline|dapr}/{http|grpc}与/unsubscribe/...订阅与退订配置项/update/{true|false}向配置存储写入/更新键值true表示作为订阅触发源。3.2 k6 压测脚本与准入阈值压测由 k6 脚本 test.js 驱动关键配置施压模型ramping-vus从 0 起步2 秒爬升至 100 VU3 秒爬升至 300 VU4 秒爬升至 500 VUgracefulRampDown: 0s准入阈值checks: [rate1]所有请求必须通过断言以及http_req_duration: [avg HTTP_REQ_DURATION_THRESHOLD]平均延迟低于阈值才判定通过断言每次请求检查响应码落在 2xx 区间全部通过rate1才视为测试通过收尾teardown 阶段调用 Dapr 的/v1.0/shutdown优雅关闭 sidecar。测试使用的延迟阈值定义在 configuration_test.goGet 为 60 msSubscribe 因协议差异分别设定——HTTP 为 450 ms注释说明 HTTP 订阅按 key 逐个发起 HTTP 往返延迟天然更高、gRPC 为 350 msgRPC 采用流式订阅。3.3 基线与 Dapr 双路径对比Get 测试流程以 gRPC 为例见 TestConfigurationGetGRPCPerformance获取应用外部地址并执行 60 次健康检查调用/initialize-updater初始化配置更新器向存储写入key1val1先跑基线/get/baseline/grpc再跑 Dapr 路径/get/dapr/grpc汇总两侧 p95、平均延迟的差值百分比并采集应用与 sidecar 的 CPU、内存及重启次数printLatency。Subscribe 流程subscribeTest则更贴近真实订阅场景先订阅key1拿到 subscriptionID再在 k6 压测期间执行/update/true持续变更该键以触发通知最后退订并汇总指标。3.4 可调参数测试参数统一由 tests/perf/test_params.go 管理支持通过环境变量覆盖默认值默认 QPS1、连接数1、时长1m便于复现时调整压力环境变量作用默认值DAPR_PERF_QPS目标 QPS1DAPR_PERF_CONNECTIONS客户端连接数1DAPR_TEST_DURATION测试时长如1m、10s1mDAPR_PAYLOAD_SIZE随机 payload 大小KB0DAPR_PAYLOAD固定 payload 内容空四、GetgRPC26,810 iter/s 背后的调用链从源码看gRPC 的 Get 路径非常“薄”这正是它能跑出高吞吐的原因。入口为 pkg/api/grpc/grpc.go 的GetConfiguration按storeName解析配置存储getConfigurationStore组装configuration.GetRequest{Keys, Metadata}将存储调用包装进resiliency 出站策略ComponentOutboundPolicy(storeName, resiliency.Configuration)即重试/超时/熔断等弹性策略在此生效调用存储实现的store.Get(ctx, req)后通过diag.DefaultComponentMonitoring.ConfigurationInvoked(...)上报组件调用指标耗时与成败结果统一转换为commonv1pb.ConfigurationItem含 Metadata、Value、Version返回客户端。值得注意的两点实现细节弹性策略内建于热路径Get 的每一次读取都被 resiliency runner 包裹意味着基准结果已经包含策略判断的微小成本实际生产中该路径具备开箱即用的重试与熔断能力监控内建每次调用都会记录耗时与成败到诊断指标因此在压测时同时观察组件监控指标与 k6 指标可以进一步分离「Dapr 处理」与「存储响应」的时间占比。存储侧对应的真实配置示例可参考 tests/config/dapr_redis_configuration.yaml。需要说明的是报告中约 500 ms 的订阅轮询间隔与该配置存储Redis的订阅实现相关不同存储的轮询/推送机制会直接决定 Subscribe 的基线延迟。五、SubscribegRPC近零开销事件驱动的流式投递Subscribe 的延迟构成与 Get 完全不同。测试衡量的是「变更发生后到客户端收到通知」的完整等待而该等待的绝大部分来自配置存储自身的更新频率报告明确指出约 500 ms 的 p95 由存储轮询间隔决定。从源码看gRPC 订阅采用**服务端流式server-streaming**设计入口同样是 pkg/api/grpc/grpc.go 的SubscribeConfiguration每个订阅请求会构造一个configurationEventHandler见 grpc.go持有readyCh与 gRPC server streamhandler 的updateEventHandler会阻塞等待首条消息就绪后才开始向流中发送数据-h.readyCh并用互斥锁保证同一时刻只有一个 goroutine 向流写入gRPC 不允许并发 Send见代码注释配置变更事件configuration.UpdateEvent经 handler 转换为commonv1pb.ConfigurationItem列表后推送给订阅方。这一“等待就绪 → 单飞写入”的事件驱动模型加上 gRPC 流式通道的复用使得 Dapr 在投递路径上的附加延迟被压缩到p95 仅 1.82 ms0.36%。也就是说用户观察到的订阅延迟 ≈ 存储轮询间隔 Dapr 投递开销前者是主导项后者可忽略。这也解释了为何报告中 Subscribe 的吞吐968 iter/s远低于 Get——它测的是“通知到达”的周期速率受限于存储侧更新节奏而非 Dapr 的转发能力。六、实战要点与复现指南6.1 选型建议基于本报告数据读密集的配置场景优先走 gRPC Get26,810 iter/s、p95 21.53 ms、100% 成功率适合大规模服务启动时的配置拉取与周期刷新HTTP 路径23,326 iter/s、p95 23.14 ms同样可用差异源于 HTTP/1.1 协议开销。订阅场景不必担心 Dapr 开销无论 gRPC 还是 HTTP投递延迟都主要由存储轮询间隔决定。若对通知时效敏感应优先选择推送型/短轮询的配置存储而不是指望通过 Dapr 优化来压低延迟。以基线对比评估自身环境报告采用的 baseline/dapr 双路径法可直接迁移到自己的集群用p95_dapr - p95_baseline量化 Dapr 引入的真实开销。6.2 在仓库内复现与扩展部署测试应用与配置存储参考 tests/config/ 下的 Redis 配置存储样例在支持 Kubernetes 测试平台的集群中运行测试入口见 TestConfigurationGetGRPCPerformance 与 TestConfigurationSubscribeGRPCPerformanceGo 构建标签为perf通过 test_params.go 的环境变量调整 QPS、连接数与时长或修改 test.js 的ramping-vus阶段以改变施压曲线调整准入阈值Get 60 ms、Subscribe gRPC 350 ms / HTTP 450 ms可快速验证不同规模下是否“达标”。七、总结Dapr v1.17.0 的 Configuration API 在 gRPC 通道上的基准数据可概括为两句话Get 是一条高吞吐、低延迟、稳定可靠的热路径26,810 iter/sp50 6.67 msp95 21.53 ms24 万请求零失败Subscribe 是一条事件驱动、开销可忽略的投递通道Dapr 附加延迟仅 1.82 ms / 0.36%延迟主体是配置存储的轮询间隔。这两项结论均有仓库内的压测工程tests/perf/configuration/与 gRPC API 实现pkg/api/grpc/grpc.go双重支撑可作为容量规划、协议选型与配置存储选型时的参考依据。【免费下载链接】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),仅供参考
返回列表