ARTICLE DETAIL

资讯详情

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

Dapr 1.8.0 版本解析:死信队列、分布式锁、WASM 中间件与弹性策略新特性全解读

Dapr 1.8.0 版本解析:死信队列、分布式锁、WASM 中间件与弹性策略新特性全解读 Dapr 1.8.0 版本解析死信队列、分布式锁、WASM 中间件与弹性策略新特性全解读【免费下载链接】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 1.8.0 是 Dapr 在 2022 年 6 月发布的里程碑版本核心主题围绕生产可用性展开引入死信队列Dead Letter Topics处理不可投递消息、新增分布式锁 APIalpha、支持用外部 WASM 模块编写中间件、进一步完善弹性策略Resiliency Policies并带来了一批 Kubernetes 部署与运维层面的增强。读完本文你将掌握 1.8.0 各核心特性的使用方式、配置参数、升级路径以及它们在当前仓库源码中的具体实现位置可直接对照仓库深入研读。一、版本概览与 Highlights本版本的 Highlights 集中在七个方向分别对应运行时、组件与运维能力的补齐Dead letter topics当应用因瞬时故障或业务逻辑失败无法处理消息时将无法投递的消息转发到死信主题。分布式锁 APIalpha新增对共享资源互斥访问的 alpha API。WASM 中间件支持可用外部 WASM 模块编写 Dapr 中间件支持非 Go 语言扩展。弹性策略preview延续 v1.7 的弹性策略能力新增默认重试覆盖与改进的日志。共享状态的命名空间支持不同命名空间、相同appid的应用可复用同一状态存储。Metadata API 返回组件能力列表可查询 sidecar 已加载组件的 pub/sub 与 state store 能力。Sidecar 证书安装支持支持在 Linux 与 Windows 容器中安装证书。其余还包括新的参数与注解、Kubernetes 改进、组件稳定化、新组件、SDK 增强与 CLI 新命令。下文将逐一展开并结合仓库源码佐证实现细节。二、Dead Letter Topics死信队列2.1 解决什么问题应用并非总能成功处理订阅到的消息处理消息时可能遇到瞬时故障如临时无法访问处理消息所需的数据或者业务逻辑返回错误。在 1.8.0 之前这类消息只能被反复重试或直接丢弃。死信主题机制将无法投递给订阅应用的消息转发到指定的死信主题供后续排查、补偿或人工处理。2.2 声明式订阅中的配置方式在声明式订阅Declarative Subscription中通过deadLetterTopic字段指定死信主题。当前仓库中该字段定义于 pkg/apis/subscriptions/v2alpha1/types.goapiVersion: dapr.io/v2alpha1 kind: Subscription metadata: name: myevent-subscription spec: pubsubname: pubsub topic: neworder routes: default: /checkout deadLetterTopic: neworder-deadletter bulkSubscribe: enabled: falseSubscriptionSpec结构体包含以下核心字段字段类型说明pubsubnamestringPub/Sub 组件名称topicstring要订阅的主题名metadatamap订阅的可选元数据routesRoutes该主题的路由规则rules列表 默认路径defaultdeadLetterTopicstring可选该主题的死信队列主题名bulkSubscribeBulkSubscribe批量订阅配置enabled、MaxMessagesCount、MaxAwaitDurationMs死信主题在运行时中的落点可见于 pkg/runtime/compstore/subscriptions.go订阅组件在处理声明式订阅时会将DeadLetterTopic写入组件存储。从源码结构看运行时在消息投递失败如应用返回错误、路由规则未匹配且无默认路由后会将该消息重新发布到死信主题而非直接丢弃。三、分布式锁 APIalpha3.1 设计动机分布式应用中的多个实例可能并发访问同一共享资源如数据库记录、外部系统接口。分布式锁提供对共享资源的互斥访问能力保证同一时刻只有一个实例能持有锁执行关键操作。3.2 HTTP 接口与实现分布式锁以 alpha 版本v1alpha1暴露为两个 HTTP 端点实现在 pkg/api/http/lock.goPOST http://localhost:daprPort/v1.0-alpha1/lock/{storeName}尝试获取锁TryLockPOST http://localhost:daprPort/v1.0-alpha1/unlock/{storeName}释放锁UnlockTryLock请求体关键参数{ resourceId: resource1, lockOwner: owner1, expiryInSeconds: 30 }resourceId锁资源的唯一标识同一resourceId的锁互斥lockOwner锁持有者标识用于区分不同调用方释放锁时校验expiryInSeconds锁的过期时间秒防止持有者崩溃后锁永久无法释放。Unlock请求体为resourceId与lockOwner响应中的status字段以数字枚举形式返回源码中通过UseEnumNumbers: true序列化见 pkg/api/http/lock.go。当前仓库配套的分布式锁组件为 Redis Distributed Lock见下文新组件。.NET SDK 在 1.8.0 中同步提供了分布式锁 API 支持Java、Python SDK 也覆盖了该 API 的调用能力。四、WASM 中间件支持4.1 背景与价值Dapr 中间件组件此前只能用 Go 编写。1.8.0 引入 WASM 支持后开发者可以用非 Go 语言如 Rust、C、AssemblyScript 等可编译为 WASM 的语言编写中间件逻辑通过外部 WASM 模块扩展 Dapr。仓库中的 WASM 组件注册与识别机制位于 pkg/components/wasm.go通过RegisterWasmComponentType(category, typeName)注册 WASM 组件类型IsWasmComponentType(componentType)判断某组件是否为 WASM 类型。运行时在加载组件时会据此走 WASM 执行路径。4.2 配置示例WASM 中间件在组件配置中通过type: middleware.http.wasm声明并指定.wasm二进制模块路径基本形态如下apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: wasm-middleware spec: type: middleware.http.wasm version: v1 metadata: - name: path value: ./my-middleware.wasmpath元数据指向 WASM 模块文件。该特性将 HTTP 请求处理委托给 WASM 模块执行实现请求过滤、改写等自定义逻辑。五、弹性策略Resiliency Policiespreview增强5.1 覆盖默认重试Dapr 对部分请求失败与瞬时错误内置了默认重试。1.8.0 允许通过弹性策略中保留的关键字命名reserved named keywords覆盖这些内置默认重试逻辑。例如对内置操作使用保留名称NoBuiltInRetries关闭默认重试apiVersion: dapr.io/v1alpha1 kind: Resiliency metadata: name: myresiliency spec: policies: retries: NoBuiltInRetries: policy: none对应的运行时支持来源于 issue #4449 Provide a Default Policy for Built-In Retries via Resiliency见下节 Changelog弹性策略的加载、断路器模板与调用上下文处理在 pkg/resiliency 目录下实现v1.8 还修复了endpointPolicy获取断路器模板与 map 取值缺失 ok 的问题PR #4505。5.2 改进的弹性日志1.8.0 起sidecar 启动时会以信息日志输出已加载的弹性策略清单开启 debug 日志后还能看到各策略的触发频率与作用目标targets便于在生产中观察重试、超时与断路器是否按预期工作。相关改进见 issue #4600 Improve the logs for resiliency policies。六、共享状态的命名空间支持当多个应用共享同一状态存储时不同命名空间中appid相同的应用此前会产生状态键冲突。1.8.0 通过状态键命名空间前缀Option to prefix state key with namespaceissue #4676将状态按命名空间隔离apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore spec: type: state.redis version: v1 metadata: - name: keyPrefix value: namespacekeyPrefix支持的值包括值行为appid默认状态键以应用 appid 为前缀namespace状态键附加命名空间前缀实现命名空间级隔离none不添加前缀多个应用共享键空间这样位于不同命名空间、具有相同appid的应用可以安全复用同一状态存储互不覆盖。七、Metadata API 返回组件能力列表Metadata API 增强后可查询 sidecar 已加载组件的能力capabilities尤其是 pub/sub 与 state store 的能力。实现位于 pkg/api/universal/metadata.go每个组件会附带capabilities数组curl http://localhost:3500/v1.0/metadata响应片段示意{ components: [ { name: statestore, type: state.redis, version: v1, capabilities: [ETAG, TRANSACTIONAL, QUERY_API, ACTOR] } ] }能力列表来自组件层暴露的特性声明组件贡献仓库 issue #1775 Components capabilities: adding query api to the feature list运行时通过getComponentsCapabilitiesFn汇总并随GET /v1.0/metadata返回。应用可在启动后据此动态判断组件是否支持 QUERY_API、事务等能力从而选择合适的调用方式。八、Sidecar 证书安装支持Dapr sidecar 现在支持在Linux 与 Windows 容器中安装证书issue #4587满足两类典型场景HTTP binding 使用自签名证书的 SSLsidecar 可信任自签名 CA实现 HTTPS 出站调用配置带客户端证书认证的出站代理如 Squidsidecar 安装客户端证书后可通过代理进行双向 TLS 认证。证书文件名/密钥名可通过命令行参数配置issue #4428 Allow setting certificates filenames/secret keys through command line flags。该能力使 Dapr 在企业代理与私有 CA 环境中具备更强的开箱可用性。九、新参数与注解1.8.0 新增了若干参数与注解核心三项如下能力注解 / 参数说明配置 Actor Placement 服务地址dapr.io/placement-host-address/--placement-host-address设置或关闭置空Placement 主机地址实现在 pkg/injector/annotations/annotations.go禁用内置 Kubernetes Secret Storedapr.io/enable-builtin-k8s-secret-store/--enable-builtin-k8s-secret-storefalse关闭默认加载的 Kubernetes 内置密钥存储issue #4605挂载 Pod 卷到 sidecardapr.io/volume-mounts以读写或只读模式将 Pod 卷挂载到 sidecar 容器issue #4662dapr.io/placement-host-address允许显式指定 Placement 服务地址列表将值设为空可关闭 daprd 对 Placement 的启用issue #3761。dapr.io/enable-builtin-k8s-secret-storeKubernetes 模式下 Dapr 默认注册内置 Kubernetes 密钥存储某些严格安全环境需要显式关闭。dapr.io/volume-mounts格式为mountPath:hostPath:readOnly的列表例如/data:/mnt/data:true便于向 sidecar 注入证书、配置文件等。十、Kubernetes 相关改进10.1 Operator WatchdogDapr Operator 新增watchdog能力issue #4171持续确保 Pod 中存在 Dapr sidecar尤其在应用或集群发生故障时能自动补齐缺失的 sidecar提升整体弹性。仓库中的实现证据pkg/operator/operator.goOperator 通过getSideCarInjectedNotExistsSelector()选择未被注入 sidecar 的 Pod并注册独立的watchdog控制器pkg/operator/meta/consts.go定义标签dapr.io/watchdog-patched用于标记已由 watchdog 修补过的 Podpkg/operator/watchdog_test.go测试覆盖了为未打标签的 Pod 执行 patch的行为。10.2 其他 Kubernetes 增强Tekton Pipelines 注入无需特殊 RBAC 权限即可注入 Dapr sidecarStatefulSets 的 Pub/Sub fanout支持为 StatefulSet 开启 pub/sub 广播issue #4195Mariner 基础镜像新增基于 CBL-Mariner 的-mariner标签容器镜像变体issue #4673更严格的 RBAC 环境增强dapr_rbacClusterRoleissue #4188支持automountServiceAccountToken: false的 Podissue #4227Agones 集成Dapr 与游戏服务器托管框架 Agones 的集成issue #4680。十一、组件改进11.1 组件稳定化本版本集中为组件向beta与stable认证推进新增认证测试并修复质量问题。以下组件正式升级为beta状态其中数款为stable candidate即将转正Azure Table Storage State Storestable candidateAzure Event Hubs Bindingstable candidateAzure Storage Queues Bindingstable candidatePostgreSQL State Storestable candidateAzure Event Hubs Pub/Substable candidate组件认证生命周期分为alpha→beta→stablebeta组件需通过认证测试certification tests并解决质量问题相关认证测试如 Azure Table Storage、Azure Event Hubs、Redis 等在组件贡献仓库中均有对应条目。11.2 新组件组件总数突破 105本版本新增组件一览组件类型用途RouterChecker HTTP Request Routingmiddlewarev1.6 已加入、本版本补充文档的 HTTP 请求路由中间件Commerce Tools Bindingbinding对接 commercetools 电商平台的输出绑定Apache Dubbo Bindingbinding对接 Apache Dubbo 的输出绑定Huawei OBS Bindingbinding华为云对象存储 OBS 绑定Huawei CSMS Secret Storesecret store华为云 CSMS 密钥存储In-memory State Storestate store开发环境用内存状态存储RocketMQ Pub/SubpubsubApache RocketMQ 消息发布订阅Wasm Basic HTTP Middlewaremiddleware基于 WASM 的基本 HTTP 中间件Redis Distributed Locklock基于 Redis 的分布式锁组件其中Redis Distributed Lock是分布式锁 API 的首个落地组件In-memory State Store专为本地开发调试设计零依赖即可体验状态管理。十二、预览特性转正以下在 preview 状态至少两个版本的特性转为stableActor Reminder PartitioningActor 提醒器分区支持对 Actor 提醒器进行分区提升大规模场景下的扩展性与性能issue #3813Actor type metadataActor 类型元数据转正issue #4736Pub/Sub Routing发布订阅路由转正issue #4742。十三、SDK 改进各官方 SDK 在 1.8.0 中的更新要点SDK主要更新PythonConfiguration API 取消订阅事件按 Actor 类型的运行时配置Actor timer/reminder 支持 TTL 与时间/间隔格式Java新增 Pub/Sub 路由支持.NETConfiguration API 取消订阅按 Actor 类型配置分布式锁 API发布消息时可设置 CloudEvent 属性与路由JavaScriptSDK 迁移到新包dapr/dapr旧包dapr-client进入弃用路径Actor reminder/timer TTLConfiguration APIgRPC proxy可配置 SDK 日志器Go若干文档注释与函数定义的修正十四、CLI 变更新增dapr annotate命令为已部署的 Kubernetes 配置添加 Dapr 注解dapr init/dapr upgradek8s 模式支持 GHCR 与私有镜像仓库文档化dapr version命令支持 JSON 输出格式修复dapr upgrade在 edge 版本上的 panic、dapr init --from-file配置初始化 bug、--dapr-http-read-buffer-size未正确传递等问题。十五、升级到 Dapr 1.8.015.1 本地机器 / 自托管模式先卸载当前版本 CLI会删除默认$HOME/.dapr目录、二进制文件以及dapr_redis、dapr_placement、dapr_zipkin容器Linux 用户若 docker 命令需要 sudo 则需加 sudodapr uninstall --all安装最新 CLI 后执行dapr init --runtime-version1.8.0等待更新完成后验证版本$ dapr --version CLI version: 1.8.0 Runtime version: 1.8.015.2 Kubernetes 模式从旧版本升级零停机方式一CLI 升级dapr upgrade --runtime-version 1.8.0 -k高可用模式升级dapr upgrade --runtime-version 1.8.0 --enable-hatrue -k等待操作完成后用dapr status -k检查状态。方式二Helm 升级helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update helm upgrade dapr dapr/dapr --version 1.8.0 --namespacedapr-system --wait注意升级完成后务必重启 Deployment使 Pod 挂载新版本的 Dapr sidecar。全新安装使用 Helm 3helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update kubectl create namespace dapr-system helm install dapr dapr/dapr --version 1.8.0 --namespace dapr-system --wait或使用 CLIdapr init --runtime-version1.8.0 -k安装后验证控制面组件健康状态预期输出形态$ dapr status -k NAME NAMESPACE HEALTHY STATUS REPLICAS VERSION AGE CREATED dapr-dashboard dapr-system True Running 1 0.10.0 15s 2022-06-24 13:07.39 dapr-sidecar-injector dapr-system True Running 1 1.8.0 15s 2022-06-24 13:07.39 dapr-sentry dapr-system True Running 1 1.8.0 15s 2022-06-24 13:07.39 dapr-operator dapr-system True Running 1 1.8.0 15s 2022-06-24 13:07.39 dapr-placement dapr-system True Running 1 1.8.0 15s 2022-06-24 13:07.39最后对已有 Deployment 执行滚动重启以加载新 sidecarkubectl rollout restart deploy/deployment-name十六、Breaking Changes本版本的破坏性变更集中在.NET SDKApp API Token 支持相关问题被解决issue #835涉及应用 API Token 的校验与传递逻辑调整。升级到 1.8.0 的 .NET 应用请重点回归验证使用 App API Token 的场景。十七、Dapr Runtime 核心 Changelog节选本版本运行时层面最值得关注的变更完整清单见 docs/release_notes/v1.8.0.mdADDEDPub/Sub 死信主题#2217ADDEDKubernetes 注解控制 daprd 中 Placement 组件的启停#3761ADDEDOperator watchdog 能力确保 Pod 中存在 sidecar#4171ADDEDStatefulSets 的 Pub/Sub 订阅支持#4195ADDEDMetadata API 提供 sidecar 能力信息#4367ADDED通过 Resiliency 为内置重试提供默认策略#4449ADDED支持向 sidecar 容器安装证书#4587ADDED弹性策略日志改进#4600ADDED内置 Kubernetes Secret Store 启停开关#4605ADDEDsidecar 卷挂载支持#4662ADDED基于 Mariner 的-mariner容器镜像变体#4673ADDED状态键命名空间前缀选项#4676ADDEDDapr 与 Agones 集成#4680CHANGEDDapr 运行时改用 Go 1.18 构建#4570CHANGEDActor Reminder 分区不再是预览特性#3813组件与各 SDK 的完整变更条目同样收录于 docs/release_notes/v1.8.0.md包括 MQTT 默认qos改为1、cleanSession默认改为false等行为调整升级前建议逐条核对。十八、小结Dapr 1.8.0 是一次以生产韧性为关键词的版本迭代死信队列与弹性策略覆盖让消息与调用在故障面前更可控分布式锁补全了并发控制拼图WASM 中间件打开了非 Go 扩展的通道Operator watchdog、Mariner 镜像与更细的注解参数则显著改善了 Kubernetes 上的运维体验。结合本文给出的源码路径如 pkg/api/http/lock.go、pkg/apis/subscriptions/v2alpha1/types.go、pkg/operator/operator.go、pkg/api/universal/metadata.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),仅供参考
返回列表