ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Dapr 1.5.1 版本解析:Cosmos DB 重试、订阅 CRD 转换与稳定性修复全解读

Dapr 1.5.1 版本解析:Cosmos DB 重试、订阅 CRD 转换与稳定性修复全解读 Dapr 1.5.1 版本解析Cosmos DB 重试、订阅 CRD 转换与稳定性修复全解读【免费下载链接】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 1.5.1 是紧随 1.5.0 之后发布的一个补丁hotfix版本聚焦于运行时Runtime与 CLI 的稳定性、安全性与正确性修复。它针对 Azure Cosmos DB 组件初始化遇 429 限流导致 sidecar 重启或挂起的问题引入了重试机制修复了 Pub/Sub 订阅 CRD 从v1alpha1转换到v2alpha1时丢失scopes的缺陷并升级了存在 DoS 漏洞的 WebSocket 依赖库。读完本文你将掌握该版本每个修复项的根因、解决思路、对应的源码实现位置以及升级到 1.5.1 时需要注意的 CRD 替换步骤。版本概览与升级要点Summary一次聚焦稳定性的补丁发布Dapr 1.5.1 主要解决以下问题模块修复内容Runtime为 Cosmos DB State 与 Binding 组件的TooManyRequests初始化错误增加重试逻辑Runtime修复v1alpha1到v2alpha1订阅转换丢失scopes的问题Runtime升级github.com/nhooyr/websocket至 1.8.7修复 DoS 漏洞Runtime修复 RabbitMQ Pub/Sub 组件的竞态条件Runtime修复 Configuration API Preview 中订阅时的崩溃问题Runtime修复 Dapr Operator 中 gRPC 连接泄漏问题CLI修复使用 Unix Domain Socket 时 Shutdown 调用挂起的问题升级前必读Helm 升级需先替换 Subscription CRD发布说明中明确了一条重要提示如果你使用 Helm而非 Dapr CLI升级到本版本必须在执行 Helm 升级之前更新 Subscription CRDkubectl replace -f https://raw.githubusercontent.com/dapr/dapr/v1.4.4/charts/dapr/crds/subscription.yaml这条命令以kubectl replace方式用 1.4.4 的 CRD 文件替换集群中现有的 Subscription CRD使集群具备对v2alpha1订阅版本的支持具体原因见下文“订阅转换”一节。当前仓库中对应的 CRD 定义位于 charts/dapr/crds/subscription.yaml从该文件的结构可以看出CRD 同时注册了v1alpha1与v2alpha1两个版本# charts/dapr/crds/subscription.yaml节选结构示意 spec: versions: - name: v1alpha1 ... - name: v2alpha1 ...此外发布说明还提示使用1.4.x版本的应用应考虑同步升级到关联的1.4.4或更高版本因为该版本修复了类似的一批问题。修复一Cosmos DB 组件初始化 429 限流重试与生产建议问题现象部分使用 Azure Cosmos DB 组件Output Binding 与 State Store的 sidecar 在初始化时失败导致 sidecar 反复重启或长时间挂起最多持续到默认 5 秒的initTimeout。sidecar 日志中可以看到来自 Cosmos DB 的429 Request rate too large响应。根因分析每个到 Azure Cosmos DB 的新连接在建立初期都会产生大量元数据请求。当多个连接同时访问同一个 Cosmos DB 账户即使访问的是该账户下的不同数据库时很容易超出账户的元数据请求速率限制。如果组件初始化并连接 Cosmos DB 的尝试因该限流而失败此前 Dapr 不会自动重试只能等待 sidecar 重启后再试。解决方案两条腿走路1. 生产最佳实践强烈建议为最小化该问题发生的概率发布说明给出三条实践指导按需加载组件确保应用和 sidecar 只在确实需要时才加载 Azure Cosmos DB 组件避免其他微服务或应用产生不必要的数据库连接。实现方式是对组件做应用级 scoping组件作用域参见当前仓库中订阅/组件的 scopes 字段定义pkg/apis/subscriptions/v2alpha1/types.go。错峰启动选择顺序部署或顺序启动所有应用的策略尽量减少对 Cosmos DB 账户的新连接突发burst。账户隔离避免为不相关的数据库或系统复用同一个 Cosmos DB 账户包括 Dapr 之外的系统。不同的 Cosmos DB 账户拥有各自独立的速率限制。2. 代码层修复初始化阶段重试Dapr 现在会在配置了initTimeout的情况下最多重试 5 分钟建立与 Azure Cosmos DB 的初始连接。注意组件初始化的默认超时时间是5 秒需要在你自己的组件定义中显式指定更大的initTimeout时长组件才会尝试重连更长的initTimeout会延迟 sidecar 的就绪状态在 Kubernetes 中可能需要相应调整 liveness 与 readiness 探针。initTimeout是组件 spec 的标准字段定义于当前仓库的组件类型中pkg/apis/components/v1alpha1/types.go。它位于ComponentSpec之下、与type、version、metadata平级属于可选字段optional。一个典型的组件定义示例如下apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: cosmosdb-state spec: type: state.azure.cosmosdb version: v1 initTimeout: 1m metadata: - name: url value: ... - name: masterKey secretKeyRef: name: cosmosdb-secret key: masterKey从源码结构看initTimeout的值会在运行时组件加载阶段被解析并用于控制初始化等待窗口可参考测试用例 pkg/runtime/runtime_test.go 中initTimeout: 1ms的用法测试中以极小超时验证超时路径。修复二Pub/Sub 订阅从v1alpha1到v2alpha1的转换丢失 scopes背景为什么需要v2alpha1为了引入 Pub/Sub 路由routing预览特性订阅 CRD 需要一个新的版本v2alpha1Dapr Operator 必须提供转换 Webhook把旧版本v1alpha1的订阅转换为v2alpha1。问题与根因以v1alpha1创建的订阅在经 Operator 转换为v2alpha1时会丢失scopes字段。根因是转换函数没有把Scopes从v1alpha1复制到v2alpha1。源码验证转换函数现在显式复制 Scopes当前仓库中该转换逻辑位于 pkg/apis/subscriptions/v2alpha1/conversion.go两个方向的转换函数均已加入// Copy scopes逻辑// ConvertTo 将 v2alpha1 订阅转换为 Hub 版本v1alpha1 func (s *Subscription) ConvertTo(dstRaw conversion.Hub) error { dst, ok : dstRaw.(*v1alpha1.Subscription) if !ok { return errors.New(expected to convert to *v1alpha1.Subscription) } // Copy scopes dst.Scopes s.Scopes ... } // ConvertFrom 从 Hub 版本v1alpha1转换到本版本 func (s *Subscription) ConvertFrom(srcRaw conversion.Hub) error { src, ok : srcRaw.(*v1alpha1.Subscription) if !ok { return errors.New(expected to convert from *v1alpha1.Subscription) } // Copy scopes s.Scopes src.Scopes ... }可以看到ConvertTov2alpha1 → v1alpha1与ConvertFromv1alpha1 → v2alpha1都包含dst.Scopes s.Scopes/s.Scopes src.Scopes的赋值除 scopes 外转换还会同步ObjectMeta与Spec下的Pubsubname、Topic、Metadata、Route与Routes.Default互转、DeadLetterTopic、BulkSubscribe等字段Scopes字段在两个版本的类型定义中均存在pkg/apis/subscriptions/v1alpha1/types.go 与 pkg/apis/subscriptions/v2alpha1/types.go均为json:scopes,omitempty即 CRD 清单中的scopes数组字段。这也解释了为何升级时必须替换 Subscription CRD只有集群中的 CRD 同时声明了v1alpha1与v2alpha1两个版本见 charts/dapr/crds/subscription.yaml 中versions列表下的两个条目Operator 的转换 Webhook 才能正确完成带 scopes 的版本互转。修复三WebSocket 库升级修复 DoS 漏洞漏洞背景github.com/nhooyr/websocket是一个轻量、符合 Go 惯用风格的 WebSocket 库。受影响版本存在拒绝服务DoS漏洞如果对端为每个 ping 回复多个 pong可能触发双重 channel close panic——当第二个 pong 在 ping 协程从 map 中删除其 channel 之前到达时channel 会被关闭两次并引发 panic。根因与修复Dapr 此前使用的是该库的v1.8.6版本。本版本将其升级到v1.8.7从而消除了该漏洞。这类依赖升级体现了补丁发布对供应链安全dependency security的重视。修复四RabbitMQ Pub/Sub 组件竞态条件问题与根因RabbitMQ Pub/Sub 组件的实现不够健壮尤其是在一个应用同时使用多个发布者/订阅者时对底层 AMQP 层的并发调用会导致发布与订阅出现竞态条件和失败。解决方案本热修复将线程同步范围扩展到整个 “publish” 和 “subscribe” 操作消除了发布者与订阅者访问底层 AMQP 层时的竞态条件。此外该热修复还为 RabbitMQ Pub/Sub 组件新增了一套完整的认证测试certification test测试成功完成即代表该组件已达到stable稳定状态。修复五Configuration API Preview 订阅崩溃问题与根因SubscribeConfigurationAlpha1方法用于订阅配置更新但调用该方法会导致 Dapr 崩溃。根因是实现中存在一个未初始化的 map触发 nil-memory panic。解决方案修复正确初始化了该 map使应用能够正常收到配置项变更的通知。当前仓库中该 API 的入口实现在 pkg/api/grpc/grpc.go对应 gRPC 服务端点定义于 pkg/api/grpc/endpoints.go相关测试覆盖见 pkg/api/grpc/grpc_test.go。这类 nil map 写入导致 panic 的问题在 Go 中非常典型也提醒所有使用 map 的开发者var m map[string]T声明后必须m make(map[string]T)才能安全写入。修复六Dapr Operator gRPC 连接泄漏问题现象当大量 Pod 被频繁销毁时服务端需要主动检测连接是否可用以防止 Operator 通道资源泄漏。日志中可能出现类似如下错误time... levelwarning msgerror updating sidecar with component ...: rpc error: code Unavailable desc transport is closing instancedapr-operator-abc-xyz scopedapr.operator.api typelog verunknown根因与解决方案根因是 Dapr Operator不会主动关闭过期的连接。修复后Operator 会主动检测到 sidecar 的 gRPC 连接是否仍然活跃及时清理失效连接避免通道资源被持续占用。修复七[CLI] Unix Domain Socket 下 Shutdown 挂起问题与根因使用 Unix Domain SocketUDS时Shutdown 调用会挂起导致应用只能被手动终止。根因是实现该特性所用的库不会自动关闭空闲的 HTTP 连接。解决方案在关闭逻辑中显式关闭空闲的 HTTP 连接确保 UDS 场景下 Shutdown 调用能够正常返回。关联版本与升级路径小结本版本对应的关联修复版本为1.4.4或更高使用 1.4.x 的用户应优先考虑升级。升级到 1.5.1 时若使用 Helm 而非 Dapr CLI请务必先执行文章开头给出的kubectl replace命令替换 Subscription CRD再执行 Helm upgrade。若你的工作负载使用 Azure Cosmos DB 组件建议按“生产最佳实践”一节调整组件加载方式、部署节奏与账户规划并在组件定义中合理设置initTimeout以启用重试。参考文件索引主题仓库路径订阅 CRDv1alpha1 / v2alpha1charts/dapr/crds/subscription.yaml订阅版本转换实现pkg/apis/subscriptions/v2alpha1/conversion.gov1alpha1 订阅类型定义pkg/apis/subscriptions/v1alpha1/types.gov2alpha1 订阅类型定义pkg/apis/subscriptions/v2alpha1/types.go组件类型定义含initTimeoutpkg/apis/components/v1alpha1/types.goConfiguration 订阅 API 实现pkg/api/grpc/grpc.goOperator 订阅 API 实现pkg/operator/api/subscriptions.go发布说明原文docs/release_notes/v1.5.1.md【免费下载链接】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),仅供参考
返回列表