ARTICLE DETAIL

资讯详情

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

Argo Workflows 数据库信号量引用类型 SyncDatabaseRef 详解:key 字段语义、底层实现与 Java SDK 用法

Argo Workflows 数据库信号量引用类型 SyncDatabaseRef 详解:key 字段语义、底层实现与 Java SDK 用法 Argo Workflows 数据库信号量引用类型 SyncDatabaseRef 详解key 字段语义、底层实现与 Java SDK 用法【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflowsSyncDatabaseRef 是 Argo Workflows 同步机制Synchronization中用于声明数据库信号量database-backed semaphore的引用类型当多个 workflow-controller 实例需要共享同一把分布式锁时通过它指向持久化在 PostgreSQL / MySQL / MariaDB 中的信号量配置。阅读本篇后你将掌握该类型的字段语义、key 的命名规范、在 Workflow 清单中的完整配置方式以及它在 workflow-controller 源码与 Java 客户端 SDK 中的实际落地形态。SyncDatabaseRef 是什么数据库信号量的引用载体在 Argo Workflows 的同步模型中信号量Semaphore用来限制一组 Workflow 或 Template 的最大并发执行数。传统的信号量配置存放在 ConfigMap 中只能作用于单个集群内的单个控制器而要让多个 controller 共享同一把锁则需要把信号量配置落到数据库中。SyncDatabaseRef 就是指向这种数据库信号量配置的引用对象。本仓库中该类型的最新权威定义位于 workflow_types.gotype SyncDatabaseRef struct { Key string json:key protobuf:bytes,1,namekey }其 Protobuf 定义与之对应generated.protomessage SyncDatabaseRef { optional string key 1; }OpenAPI 生成器对它的描述为SyncDatabaseRef is a database reference for Semaphore configurationopenapi_generated.go即它是信号量配置的数据库引用。序列化与反序列化Marshal / Unmarshal / Size实现见 generated.pb.go。属性字段key本文档IoArgoprojWorkflowV1alpha1SyncDatabaseRef.md定义的属性表如下NameTypeDescriptionNoteskeyString数据库信号量的键key必填无默认值key是 SyncDatabaseRef 唯一的字段语义上表示数据库中的信号量键。它的取值规则与使用方式如下。key 的命名格式namespace/namekey必须采用 Kubernetes 标准的资源命名格式namespace/name。这一规则在文档 synchronization.md 中有明确说明The semaphore name contains the namespace, and takes the standard kubernetes format ofnamespace/name例如命名空间devel中名为test的信号量其 key 写作devel/test。在写入数据库的**限制表limit table**时应始终以namespace/key格式插入记录不要使用下文将要讲到的sem/或mtx/前缀格式——前缀是控制器内部使用的主键primary key格式用于区分信号量semaphore与互斥锁mutex。底层解析key 如何变成锁名key在控制器侧的解析逻辑见 lock_name.go 的getSemaphoreLockNamefunc getSemaphoreLockName(sem *v1alpha1.SemaphoreRef, wfNamespace string) (*lockName, error) { switch { case sem.ConfigMapKeyRef ! nil sem.Database ! nil: return nil, fmt.Errorf(invalid semaphore with both ConfigMapKeyRef and Database) case sem.ConfigMapKeyRef ! nil: // ... ConfigMap 信号量 case sem.Database ! nil: namespace : sem.Namespace if namespace { namespace wfNamespace } return newLockName(namespace, sem.Database.Key, , lockKindDatabase), nil default: return nil, fmt.Errorf(cannot get LockName for a Semaphore without a ConfigMapRef or Database) } }从这段源码可以提炼出三个关键行为二选一约束ConfigMapKeyRef与Database不能同时设置否则直接返回错误invalid semaphore with both ConfigMapKeyRef and Database命名空间回退当SemaphoreRef.Namespace未指定时默认使用 Workflow 自身的命名空间锁名由namespace sem.Database.Key组成kind 标记为Database锁名编码控制器将锁名编码为namespace/Database/resourceName的字符串lockName.String并持久化到数据库中。数据库主键sem/ 与 mtx/ 前缀编码后的锁名在数据库层进一步加工为长键long key。在 database_semaphore.go 中func (s *databaseSemaphore) longDBKey() string { if s.isMutex() { return mtx/ s.shortDBKey } return sem/ s.shortDBKey }其中shortDBKey即namespace/namelock_name.go 的getDBKey()。也就是说信号量在数据库中的实际主键形如sem/devel/test互斥锁则形如mtx/devel/test。这也是为什么创建限制表记录时只写namespace/key即可——前缀由控制器在运行时自动拼接。在 Workflow 清单中的完整用法SyncDatabaseRef 出现在SemaphoreRef.database字段中属于spec.synchronization.semaphores列表。参照 synchronization.md 与 SemaphoreRef 的 Java SDK 文档一个使用工作流级Workflow-level数据库信号量的示例为apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: database-semaphore-example- spec: entrypoint: main synchronization: semaphores: - database: key: devel/test # 数据库限制表中的信号量键namespace/name templates: - name: main container: image: alpine:3.19 command: [sh, -c, sleep 10 echo done]同样地数据库互斥锁通过mutexes[].database: true开启synchronization.md 中 Workflow-level database mutex 一节其锁名同样以mtx/前缀落入数据库。前置条件必须配置数据库需要特别强调的是数据库锁只有在 workflow-controller 配置了数据库会话PostgreSQL、MySQL 或 MariaDB后才能使用。未配置数据库却使用数据库锁会得到错误。数据库连接信息在workflow-controller-configmapConfigMap 中配置参见 workflow-controller-configmap.md建表语句由迁移逻辑维护见 database-migrations.md。控制器侧对声明了数据库锁但无数据库会话的场景有显式校验例如 sync_manager.go 与 L484 的synchronization database session is not available错误路径。限制表limit table配置数据库信号量的大小并发上限在限制表中定义每条记录以name标识格式为namespace/name。以devel/test为例字段说明name信号量名格式namespace/name即devel/test数值字段该信号量允许的最大并发 Workflow / Template 数查询所有已定义信号量限制的 SQL 方式synchronization.md-- 查看所有已定义的信号量限制 SELECT * FROM limit;控制器中的databaseSemaphore会通过GetSemaphoreLimit(ctx, s.shortDBKey)从数据库读取限制值database_semaphore.go并在获取/释放锁时维护持有者队列holder queue。相关行为在 database_semaphore_test.go 中有完整的测试覆盖。底层工作流程数据库信号量如何协作结合 sync_manager.go 与 database_semaphore.go 的源码结构可以梳理出数据库信号量的核心调用链锁名解析syncItem.lockName()根据SemaphoreRef.Database构造lockKindDatabase类型的锁名shortDBKey为namespace/name会话检查控制器在初始化与加锁前检查数据库会话是否可用needDBSession见 lock_name.go加锁与排队databaseSemaphore.lock()先尝试GetExistingLocks若锁已存在则进入等待队列checkAcquire依据限制数判断是否放行未获得许可的 Workflow 会被重新入队等待nextWorkflow触发重试状态持久化持有者状态Held/Pending通过UpdateStateToHeld、ReleaseHeld等 SQL 查询写回数据库保证多个 controller 看到一致的状态锁失效校验sync_manager.go中对于数据库锁数据库是唯一事实来源the database is the single source of truth控制器重启后若发现数据库不再记录某个持有关系会将其视为失效StaleHold避免死锁残留。此外数据库中的时间戳用于判断控制器是否存活因此各集群节点的时间必须同步否则锁的活性判断会出错synchronization.md。Java SDK 中的使用方式本仓库为 Java 客户端生成了一整套与上述类型一一对应的模型类本文档IoArgoprojWorkflowV1alpha1SyncDatabaseRef.md即其中之一。它的位置关系如下IoArgoprojWorkflowV1alpha1SyncDatabaseRef对应SyncDatabaseRef含key属性IoArgoprojWorkflowV1alpha1SemaphoreRef对应SemaphoreRef其database字段类型正是IoArgoprojWorkflowV1alpha1SyncDatabaseRef见 IoArgoprojWorkflowV1alpha1SemaphoreRef.md 属性表。因此在 Java 中构造数据库信号量引用的代码模式为IoArgoprojWorkflowV1alpha1SyncDatabaseRef dbRef new IoArgoprojWorkflowV1alpha1SyncDatabaseRef() .key(devel/test); IoArgoprojWorkflowV1alpha1SemaphoreRef semaphoreRef new IoArgoprojWorkflowV1alpha1SemaphoreRef() .database(dbRef); IoArgoprojWorkflowV1alpha1Synchronization sync new IoArgoprojWorkflowV1alpha1Synchronization() .addSemaphoresItem(semaphoreRef);随后可将该Synchronization挂载到Workflow或WorkflowTemplate的spec.synchronization字段。SDK 的生成逻辑与源码对应关系可参见 sdks/java 目录Go 语言侧的等价结构则在 pkg/apis/workflow/v1alpha1/workflow_types.go 的SemaphoreRef中。常见注意事项key 大小写与格式key需为namespace/name两段式缺少命名空间会被校验拒绝lockName.validate()中 Namespace is missing 错误不可与 ConfigMap 混用同一SemaphoreRef中configMapKeyRef与database同时存在会导致校验错误命名空间默认值未显式设置SemaphoreRef.Namespace时默认取 Workflow 所在命名空间对于数据库锁该命名空间仅用于构成键名不需要真实存在全局锁能力数据库锁天然支持跨 controller、跨集群只要指向同一数据库的全局互斥/限流必须配置数据库未在 workflow-controller-configmap 中配置数据库而使用数据库锁控制器会报错。通过本文的梳理可以看到SyncDatabaseRef 虽是一个仅含key字段的轻量引用类型但它承载了 Argo Workflows 多控制器分布式信号量的完整语义——从清单声明、key 命名到数据库主键的sem//mtx/前缀与限制表管理再到控制器源码中的加锁、排队与一致性校验形成了一个闭环的分布式同步机制。在 Java 生态中只需借助对应的 SDK 模型类即可在代码中构建出与 YAML 等价的数据库信号量配置。【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址: https://gitcode.com/gh_mirrors/ar/argo-workflows创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表