本系列基于 Conductor
release v3.5.2
1. 概述
本文主要分享Metadata API的实现,以Redis实现为例,分析 Metadata 的实现方法。
Metadata API 功能为定义工作流和任务
Conductor Server 的 API 层提供了两种实现基于 http 的 Restful 风格的接口以及 gRPC 接口。官方文档介绍中说到
The API and storage layers are pluggable and provide ability to work with different backends and queue service providers.
MetadataService 中调用的 MetadataDAO 支持4种持久化实现:
- RedisMetadataDAO
- PostgresMetadataDAO
- MySQLMetadataDAO
- CassandraMetadataDAO
2. RedisMetadataDAO
com.netflix.conductor.redis.dao.RedisMetadataDAO
构造方法中参数com.netflix.conductor.redis.jedis.JedisProxy
实例由Spring Bean创建。其中JedisProxy
主要操作的类JedisCommands
在《Netflix Conductor 源码分析—— 初始化》文中提到com.netflix.conductor.redis.config.InMemoryRedisConfiguration
中初始化。
在构造方法里还启动了一个定时线程,定时刷新任务定义缓存(taskDefCache
)。taskDefCache
为一个在内存中的Map(Map<String, TaskDef>
)
RedisMetadataDAO 各方法实现
- createTaskDef / updateTaskDef 创建或更新任务定义
89行
调用 HSET 方法保存到 redis。并刷新 taskDefCache 及记录日志 - getTaskDef 根据任务名称获取任务定义
110行
先从缓存中获取,如果缓存中没有则从redis里取 - createWorkflowDef
297行
调用 HSET 方法把定义保存到 redis。
302行
调用 SADD 把名称保存到 redis。
WorkflowDef 与 TaskDef 存储方式不一样,前者是一个名称+版本作为了一个 HASH 集合;后者所有Task放到同一个 HASH 集合