Conductor 生产环境部署指南架构拆解、Docker 部署与高可用配置【免费下载链接】conductorConductor is an event driven agentic workflow engine providing durable and highly resilient execution engine for applications and AI Agents项目地址: https://gitcode.com/GitHub_Trending/co/conductorConductor 是开源、可自托管的编排引擎生产部署意味着在自有基础设施上运行服务端并为工作流引擎搭配数据库、队列、索引与分布式锁等后端组件。本篇以 docs/devguide/running/deploy.md 为骨架结合仓库内真实的 Docker Compose 文件、服务端配置文件与ConductorProperties源码完整讲解部署架构、Docker 运行方式、数据库/队列/索引/锁的配置方法、横向扩展、监控与常见故障排查读完即可落地一套可投入生产的多实例 Conductor 集群。部署架构总览一个完整的 Conductor 部署由以下组件构成各组件职责如下组件职责API Server暴露面向工作流与任务操作的 REST 和 gRPC 端点。Decider核心状态机。评估工作流状态并调度下一批待执行任务。Sweeper后台进程轮询运行中的工作流并触发 decider 进行求值长耗时工作流能否持续推进依赖 sweeper 的正常运行。System Task Workers在服务端 JVM 内执行内置任务类型HTTP、Event、Wait、Inline、JSON_JQ 等。Event Processor监听配置的事件总线根据到达的事件触发工作流或完成任务。Database持久化工作流定义、执行状态、任务状态与 poll 数据。Queue管理任务调度待执行任务、延迟任务以及 sweeper 自身的工作队列。Index支撑 UI 与搜索 API 中的工作流/任务检索。Lock分布式锁防止多个服务端实例对同一工作流并发求值。生产环境必须启用。其中 Sweeper、System Task Workers、Event Processor 都内嵌在 Conductor server 进程中运行这是后续配置线程数、进行容量规划的前提。使用 Docker 快速运行单机一体镜像standalone想先跑起来看效果可以用官方提供的 standalone 镜像。它内置服务端、UI 和 SQLite 持久化无需任何外部依赖docker run -p 8080:8080 conductoross/conductor:latest启动后访问以下地址URL说明http://localhost:8080Conductor UIhttp://localhost:8080/swagger-ui/index.htmlREST API 文档http://localhost:8080/api/API 基础地址生产环境应固定发布标签如conductoross/conductor:3.4.0而不是latest以便在可控时机完成升级。Docker Compose 组合后端仓库自带了多套将服务端与生产后端配对编排的 compose 文件位于 docker/ 目录git clone https://github.com/conductor-oss/conductor cd conductor docker compose -f docker/docker-compose.yaml up这会在本机拉起 Conductor Redis同时充当数据库与队列 Elasticsearch索引服务端与 UI 监听8080端口。从源码构建镜像时Compose 会使用 docker/server/Dockerfile该文件基于azul/zulu-openjdk-debian:21构建 server JAR再用debian:stable-slim作为运行时镜像并内置 nginx 托管 UI 静态资源。仓库提供的预编排组合Compose 文件数据库队列索引docker-compose.yamlRedisRedisElasticsearch 7docker-compose-es8.yamlRedisRedisElasticsearch 8docker-compose-postgres.yamlPostgreSQLPostgreSQLPostgreSQLdocker-compose-postgres-es7.yamlPostgreSQLPostgreSQLElasticsearch 7docker-compose-mysql.yamlMySQLRedisElasticsearch 7docker-compose-cassandra-es7.yamlCassandraRedisElasticsearch 7docker-compose-redis-os2.yamlRedisRedisOpenSearch 2docker-compose-redis-os3.yamlRedisRedisOpenSearch 3# 示例全部使用 PostgreSQL docker compose -f docker/docker-compose-postgres.yaml up # 示例Redis Elasticsearch 8 docker compose -f docker/docker-compose-es8.yaml up # 示例Redis OpenSearch 3 docker compose -f docker/docker-compose-redis-os3.yaml up若使用 Elasticsearch 8需设置conductor.indexing.typeelasticsearch8并选用 config-redis-es8.properties 或等效的自定义配置。以 docker-compose.yaml 为例服务端通过环境变量CONFIG_PROPconfig-redis.properties加载配置并依赖 ES 与 Redis 的 healthcheck 通过后才启动docker-compose-postgres.yaml 则使用postgres:16镜像并以POSTGRES_USERconductor/POSTGRES_PASSWORDconductor初始化数据库。自定义配置注入镜像在CONFIG_PROP环境变量指向某个 properties 文件时会从/app/config读取该文件。挂载自己的文件并设置变量即可docker run -p 8080:8080 \ -e CONFIG_PROPconfig.properties \ -v /path/to/my-config.properties:/app/config/config.properties \ conductoross/conductor:latest注意不设置CONFIG_PROP时服务端会忽略挂载的文件直接以内置的 SQLite 默认配置启动。这一点在 startup.sh 中有明确逻辑——未设置CONFIG_PROP时直接java -jar conductor-server.jar运行设置后则以-DCONDUCTOR_CONFIG_FILE/app/config/$CONFIG_PROP加载配置。JVM 参数通过JAVA_OPTS环境变量传入例如-e JAVA_OPTS-Xms2g -Xmx4g。停止服务# CtrlC 停止然后 docker compose down生产配置详解Conductor 的所有配置均通过 Spring Boot propertiesapplication.properties或环境变量完成也可以以 Docker volume 挂载。配置项在源码中都有对应的属性定义与默认值核心集中在 ConductorProperties.java下文各默认值均与源码一致。数据库数据库负责持久化工作流定义、执行状态、任务状态与事件处理器定义conductor.db.typepostgres支持的数据库后端后端属性值适用场景备注PostgreSQLpostgres生产首选。ACID 事务同时可充当索引后端。需要spring.datasource.*配置。MySQLmysql团队已在使用 MySQL 时的备选。需要spring.datasource.*配置队列需另配 Redis。Redisredis_standalone快速、简单适合中等规模。需要conductor.redis.*配置也支持redis_cluster与redis_sentinel。Cassandracassandra高写入吞吐、多区域部署。需要conductor.cassandra.*配置。SQLitesqlite仅限本地开发。单文件、零配置。默认值不可用于生产。PostgreSQLconductor.db.typepostgres conductor.external-payload-storage.typepostgres spring.datasource.urljdbc:postgresql://db-host:5432/conductor spring.datasource.usernameconductor spring.datasource.passwordpassword # 可选调优 conductor.postgres.deadlockRetryMax3 conductor.postgres.taskDefCacheRefreshInterval60s conductor.postgres.asyncMaxPoolSize12 conductor.postgres.asyncWorkerQueueSize100MySQLconductor.db.typemysql spring.datasource.urljdbc:mysql://db-host:3306/conductor spring.datasource.usernameconductor spring.datasource.passwordpassword # 可选调优 conductor.mysql.deadlockRetryMax3 conductor.mysql.taskDefCacheRefreshInterval60sRedisconductor.db.typeredis_standalone # 格式host:port:rack多主机用分号分隔 conductor.redis.hostsredis-host:6379:us-east-1c conductor.redis.workflowNamespacePrefixconductor conductor.redis.queueNamespacePrefixconductor_queues conductor.redis.taskDefCacheRefreshInterval1s # 连接池 conductor.redis.maxIdleConnections8 conductor.redis.minIdleConnections5 # SSL conductor.redis.sslfalse # 认证密码取自第一条 host 条目host:port:rack:password # 或直接设置 conductor.redis.username 和 conductor.redis.password仓库自带的 config-redis.properties 展示了这一组合的实际写法并额外启用了management.health.redis.enabledtrue让 Redis 健康状态参与/actuator/health判定。队列队列后端负责任务调度追踪哪些任务处于 pending、delayed 或 ready 状态sweeper 与系统任务 worker 都依赖它conductor.queue.typepostgres支持的队列后端后端属性值适用场景PostgreSQLpostgres数据库也用 PostgreSQL 时栈最简单。Redisredis_standalone数据库是 Redis 或 MySQL 时使用低延迟。SQLitesqlite仅限本地开发。提示让队列后端与数据库匹配。PostgreSQL 数据库 PostgreSQL 队列是生产中最简单的组合——少一个外部依赖若数据库用 MySQL则用 Redis 充当队列。索引索引后端支撑 UI 及/api/workflow/search、/api/tasks/search接口的工作流与任务搜索conductor.indexing.enabledtrue conductor.indexing.typepostgres支持的索引后端后端属性值适用场景备注PostgreSQLpostgres数据库同为 PostgreSQL 时最简单的组合。需设置conductor.elasticsearch.version0禁用 ES 客户端。Elasticsearch 7elasticsearch大规模下搜索性能最佳支持全文检索。设置conductor.elasticsearch.version7。Elasticsearch 8elasticsearch8配合 ES8 persistence 模块使用。设置conductor.elasticsearch.version8。OpenSearch 2opensearch2开源的 ES 替代方案。兼容 ES 7 查询语法。OpenSearch 3opensearch3最新版 OpenSearch。SQLitesqlite仅限本地开发。禁用不适用设置conductor.indexing.enabledfalseUI 搜索将不可用。PostgreSQL 索引conductor.indexing.enabledtrue conductor.indexing.typepostgres # 禁用 Elasticsearch 客户端 conductor.elasticsearch.version0Elasticsearch 7conductor.indexing.enabledtrue conductor.elasticsearch.urlhttp://es-host:9200 conductor.elasticsearch.version7 conductor.elasticsearch.indexNameconductor conductor.elasticsearch.clusterHealthColoryellow # 性能调优 conductor.elasticsearch.indexBatchSize1 conductor.elasticsearch.asyncMaxPoolSize12 conductor.elasticsearch.asyncWorkerQueueSize100 conductor.elasticsearch.asyncBufferFlushTimeout10s conductor.elasticsearch.indexShardCount5 conductor.elasticsearch.indexReplicasCount1 # 认证如开启了安全 conductor.elasticsearch.usernameelastic conductor.elasticsearch.passwordpasswordElasticsearch 8conductor.indexing.enabledtrue conductor.indexing.typeelasticsearch8 conductor.elasticsearch.urlhttp://es-host:9200 conductor.elasticsearch.version8 conductor.elasticsearch.indexNameconductor conductor.elasticsearch.clusterHealthColoryellowOpenSearchconductor.indexing.enabledtrue conductor.indexing.typeopensearch2 # 或 opensearch3 conductor.opensearch.urlhttp://os-host:9200 conductor.opensearch.indexPrefixconductor conductor.opensearch.clusterHealthColoryellow conductor.opensearch.indexReplicasCount0异步索引高吞吐场景下建议开启异步索引将索引写入路径与工作流执行路径解耦conductor.app.asyncIndexingEnabledtrue conductor.app.asyncUpdateShortRunningWorkflowDuration30s conductor.app.asyncUpdateDelay60s源码中asyncIndexingEnabled默认值为falseConductorProperties.java需要显式开启。索引内容开关控制具体索引哪些内容conductor.app.taskIndexingEnabledtrue conductor.app.taskExecLogIndexingEnabledtrue conductor.app.eventMessageIndexingEnabledtrue conductor.app.eventExecutionIndexingEnabledtrue分布式锁生产必配。多个服务端实例并发评估同一工作流时分布式锁可防止竞态条件。生产环境务必启用基于 Redis 或 Zookeeper 的分布式锁。conductor.workflow-execution-lock.typeredis conductor.app.workflowExecutionLockEnabledtrue支持的锁提供方提供方属性值适用场景Redisredis推荐。栈中已有 Redis 时直接使用。Zookeeperzookeeper已有 Zookeeper如 Kafka 部署时使用。Locallocal_only仅限单实例开发。多实例不安全。Redis 锁conductor.workflow-execution-lock.typeredis conductor.app.workflowExecutionLockEnabledtrue conductor.app.lockLeaseTime60000 # 锁最多持有 60s conductor.app.lockTimeToTry500 # 获取锁最多等待 500ms conductor.redis-lock.serverTypeSINGLE # SINGLE、CLUSTER 或 SENTINEL conductor.redis-lock.serverAddressredis://redis-host:6379 # conductor.redis-lock.serverPasswordpassword # conductor.redis-lock.serverMasterNamemaster # Sentinel 模式使用 # conductor.redis-lock.namespaceconductor # key 前缀 conductor.redis-lock.ignoreLockingExceptionsfalseSentinel 多端点使用SENTINEL类型时可加分号分隔的多个 sentinel 地址以提升高可用conductor.redis-lock.serverTypeSENTINEL conductor.redis-lock.serverAddressredis://sentinel-0:26379;redis://sentinel-1:26379 conductor.redis-lock.serverMasterNamemymaster即使某个 sentinel 节点宕机锁客户端仍能发现 master。Zookeeper 锁conductor.workflow-execution-lock.typezookeeper conductor.app.workflowExecutionLockEnabledtrue conductor.app.lockLeaseTime60000 conductor.app.lockTimeToTry500 conductor.zookeeper-lock.connectionStringzk1:2181,zk2:2181,zk3:2181 # conductor.zookeeper-lock.sessionTimeoutMs60000 # conductor.zookeeper-lock.connectionTimeoutMs15000 # conductor.zookeeper-lock.namespaceconductor需要说明的是源码中workflowExecutionLockEnabled的默认值实际上是trueConductorProperties.javalockLeaseTime默认 60000ms、lockTimeToTry默认 500ms同文件 L80、L85与文档中的推荐值一致——在生产多实例部署中请务必确认锁提供方conductor.workflow-execution-lock.type已正确配置。Sweeper 调优sweeper 是监控运行中工作流的后台进程它轮询需要求值的工作流队列并触发 decider。没有 sweeper长耗时工作流将无法推进。sweeper 内嵌在 Conductor server 中自动运行可按工作流量调整线程数# sweeper 线程数默认availableProcessors * 2 conductor.app.sweeperThreadCount8 # 轮询 sweep 队列的等待时间默认2000ms conductor.app.sweeperWorkflowPollTimeout2000 # 每次 sweep 轮询的批大小默认2 conductor.app.sweeper.sweepBatchSize2 # 队列 pop 超时时间 ms默认100 conductor.app.sweeper.queuePopTimeout100Sweeper 容量建议从sweeperThreadCount 2 * CPU 核数起步。若工作流长时间停留在 RUNNING则调大若空闲时 CPU 占用过高则调小。系统任务 Worker系统任务 worker 在 Conductor server JVM 内部执行内置任务类型HTTP、Event、Wait、Inline、JSON_JQ_TRANSFORM 等轮询内部队列执行已调度的系统任务# 系统任务 worker 线程数默认availableProcessors * 2 conductor.app.systemTaskWorkerThreadCount20 # 单次最多轮询的任务数默认与线程数相同 conductor.app.systemTaskMaxPollCount20 # 轮询间隔默认50ms conductor.app.systemTaskWorkerPollInterval50ms # 回调间隔——多久重新检查一次异步系统任务默认30s conductor.app.systemTaskWorkerCallbackDuration30s # 队列 pop 超时时间默认100ms conductor.app.systemTaskQueuePopTimeout100ms以上默认值均可在 ConductorProperties.java 中查到源码佐证systemTaskWorkerThreadCount默认availableProcessors * 2systemTaskMaxPollCount默认等于线程数systemTaskWorkerCallbackDuration默认 30ssystemTaskWorkerPollInterval默认 50ms。独立运行系统任务 Worker大型部署中可将系统任务 worker 拆分到专用实例上与 API server 分离。通过execution namespace隔离由哪个实例处理系统任务# API 专属实例——设置一个没有 worker 监听的 namespace conductor.app.systemTaskWorkerExecutionNamespaceapi-only conductor.app.systemTaskWorkerThreadCount0 # 专用系统任务 worker 实例——保持 namespace 一致 conductor.app.systemTaskWorkerExecutionNamespaceworker-pool-1 conductor.app.systemTaskWorkerThreadCount40 conductor.app.systemTaskMaxPollCount40隔离系统任务 Worker需要按任务域隔离将特定任务路由到特定 worker 组时# 每个隔离组的线程数默认1 conductor.app.isolatedSystemTaskWorkerThreadCount4延后阈值当系统任务被轮询多次仍未完成例如 Join 等待分支时Conductor 会渐进式延迟重新求值避免忙轮询# 超过该轮询次数后开始指数退避默认200 conductor.app.systemTaskPostponeThreshold200事件处理事件处理器监听配置的事件总线根据到达的事件触发工作流或完成任务# 事件处理线程数默认2 conductor.app.eventProcessorThreadCount4 # 事件队列轮询 conductor.app.eventQueueSchedulerPollThreadCount4 # 默认CPU 核数 conductor.app.eventQueuePollInterval100ms conductor.app.eventQueuePollCount10 conductor.app.eventQueueLongPollTimeout1000ms关于 Kafka、NATS、AMQP、SQS 事件队列的具体配置参见事件驱动食谱。Kafka 相关实现位于 kafka/ 与 kafka-event-queue/NATS 位于 nats/。Payload 大小限制Conductor 强制 payload 大小上限防止超大 payload 拖垮性能。超过阈值时数据会自动存入外部 payload 存储S3、PostgreSQL 或 Azure Blob# 工作流输入/输出——超过则移入外部存储默认5120 KB conductor.app.workflowInputPayloadSizeThreshold5120KB conductor.app.workflowOutputPayloadSizeThreshold5120KB # 工作流输入/输出——硬性上限超过则工作流失败默认10240 KB conductor.app.maxWorkflowInputPayloadSizeThreshold10240KB conductor.app.maxWorkflowOutputPayloadSizeThreshold10240KB # 任务输入/输出——超过则移入外部存储默认3072 KB conductor.app.taskInputPayloadSizeThreshold3072KB conductor.app.taskOutputPayloadSizeThreshold3072KB # 任务输入/输出——硬性上限超过则任务失败默认10240 KB conductor.app.maxTaskInputPayloadSizeThreshold10240KB conductor.app.maxTaskOutputPayloadSizeThreshold10240KB # 工作流变量——硬性上限默认256 KB conductor.app.maxWorkflowVariablesPayloadSizeThreshold256KB外部 payload 存储配置参见外部 Payload 存储。仓库中 S3、GCS、Azure Blob 等存储实现分别位于 awss3-storage/、gcs-storage/、azureblob-storage/。监控与可观测性Conductor 暴露 Prometheus 兼容指标conductor.metrics-prometheus.enabledtrue management.endpoints.web.exposure.includehealth,info,prometheus management.metrics.web.server.request.autotime.percentiles0.50,0.75,0.90,0.95,0.99 management.endpoint.health.show-detailsalways其中management.endpoints.web.exposure.include一行与服务端默认一致因此即使不做自定义配置health、info、prometheus三个端点也已暴露。Prometheus 直接抓取http://conductor-host:8080/actuator/prometheus即可。可用指标清单见服务端指标与客户端指标。健康检查存活与就绪探针指向http://conductor-host:8080/actuator/health。若想专门验证 API 层请求GET /api/metadata/workflow健康服务端返回200。注意不存在/api/health端点。镜像内置的 HEALTHCHECK 亦使用curl -I -XGET http://localhost:8080/health见 Dockerfile。推荐的生产配置模板PostgreSQL 全栈最简单一个数据库搞定一切——组件最少# 数据库 conductor.db.typepostgres conductor.queue.typepostgres conductor.external-payload-storage.typepostgres spring.datasource.urljdbc:postgresql://db-host:5432/conductor spring.datasource.usernameconductor spring.datasource.passwordpassword # 索引用 PostgreSQL无需 Elasticsearch conductor.indexing.enabledtrue conductor.indexing.typepostgres conductor.elasticsearch.version0 # 锁用 Redis——轻量快速 conductor.workflow-execution-lock.typeredis conductor.app.workflowExecutionLockEnabledtrue conductor.redis-lock.serverAddressredis://redis-host:6379 # Sweeper conductor.app.sweeperThreadCount8 # 系统任务 worker conductor.app.systemTaskWorkerThreadCount20 conductor.app.systemTaskMaxPollCount20 # 指标 conductor.metrics-prometheus.enabledtrue management.endpoints.web.exposure.includehealth,info,prometheus该模板与仓库自带的 config-postgres.properties 基本一致可在其中找到对应的生产化写法含conductor.file-storage.enabledtrue与conductor.file-storage.typeconductor的文件存储开关。Redis Elasticsearch 全栈高吞吐搜索性能最好队列操作延迟最低# 数据库 队列 conductor.db.typeredis_standalone conductor.queue.typeredis_standalone conductor.redis.hostsredis-host:6379:us-east-1c conductor.redis.workflowNamespacePrefixconductor conductor.redis.queueNamespacePrefixconductor_queues # 索引 conductor.indexing.enabledtrue conductor.elasticsearch.urlhttp://es-host:9200 conductor.elasticsearch.version7 conductor.elasticsearch.indexNameconductor conductor.elasticsearch.clusterHealthColoryellow conductor.app.asyncIndexingEnabledtrue # 锁 conductor.workflow-execution-lock.typeredis conductor.app.workflowExecutionLockEnabledtrue conductor.redis-lock.serverAddressredis://redis-host:6379 # Sweeper conductor.app.sweeperThreadCount16 # 系统任务 worker conductor.app.systemTaskWorkerThreadCount40 conductor.app.systemTaskMaxPollCount40 # 指标 conductor.metrics-prometheus.enabledtrue management.endpoints.web.exposure.includehealth,info,prometheus该模板与 config-redis.properties 的配置风格一脉相承。多实例部署与横向扩展为实现高可用与横向扩展可在负载均衡器后面运行多个 Conductor server 实例。所有实例共享同一套数据库、队列、索引与锁后端——这也是工作流引擎支撑海量并发执行的架构前提。必要条件必须启用分布式锁redis或zookeeper。否则多个实例并发求值同一工作流会引发竞态。所有实例必须指向同一套数据库、队列与索引后端。负载均衡建议使用 round-robin 或 least-connections 策略。可选拆分 API 与 Worker 实例┌──────────────────┐ ┌──────────────────┐ │ API Instance 1 │ │ API Instance 2 │ ← 处理 REST/gRPC系统任务线程低 │ (systemTask0) │ │ (systemTask0) │ └────────┬─────────┘ └────────┬─────────┘ │ │ ┌────┴────────────────────────┴────┐ │ Load Balancer │ └────┬────────────────────────┬────┘ │ │ ┌────────┴──────────┐ ┌───────┴───────────┐ │ Worker Instance │ │ Worker Instance │ ← 系统任务线程高承载 sweeper │ (systemTask40) │ │ (systemTask40) │ └───────────────────┘ └───────────────────┘该拆分正是上文独立运行系统任务 Worker小节中 execution namespace 机制的集群级应用API 实例设置systemTaskWorkerExecutionNamespaceapi-only与systemTaskWorkerThreadCount0worker 实例设置匹配的 namespace 并放大线程数。故障排查速查表问题修复内存不足或性能缓慢检查 JVM 堆占用按需调整-Xms/-Xmx。用jstat或/actuator/health监控。Elasticsearch 停留在 yellow 状态设置conductor.elasticsearch.clusterHealthColoryellow或增加 ES 节点达到 green。工作流卡在 RUNNING确认 sweeper 在运行且sweeperThreadCount 0确认锁提供方可达。系统任务不执行确认systemTaskWorkerThreadCount 0且队列后端可达。配置改动不生效properties 在构建镜像时被打入 Docker 镜像。请改用挂载 volume 而不是重新构建镜像。最后一条尤其值得注意由于配置在镜像构建阶段固化生产环境调整配置时推荐通过CONFIG_PROP volume 挂载方式覆盖见上文自定义配置注入而不是反复重建镜像。结语从组件架构看Conductor 的生产部署本质上是把数据库 队列 索引 锁四个后端正确组合并调优从运行方式看standalone 镜像适合体验、Compose 组合适合快速验证、自定义挂载适合生产收敛配置从可靠性看分布式锁与 sweeper 线程数是多实例下工作流推进的命门。配合本仓库 docker/ 下的 compose 与 properties 模板以及 ConductorProperties.java 中的默认值清单即可对照本文逐项落地一套可监控、可扩展、可排障的生产部署。【免费下载链接】conductorConductor is an event driven agentic workflow engine providing durable and highly resilient execution engine for applications and AI Agents项目地址: https://gitcode.com/GitHub_Trending/co/conductor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考