本系列基于 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 集合