Netflix has significantly re-engineered its Conductor workflow orchestration engine to manage 420 million monthly executions and support 10X larger workflows (up to 30,000 tasks). Key architectural changes include migrating data stores, decoupling indexing, moving workflow evaluation out of the synchronous path, and implementing new concurrency controls to address bottlenecks at scale. This evolution showcases practical strategies for scaling complex distributed systems.
Read original on InfoQ ArchitectureNetflix's Conductor is a critical workflow orchestration engine responsible for managing distributed processes across various internal organizations, including Content, Ads, and Games. As Netflix's operations expanded, Conductor faced severe scaling limitations. Initially, it struggled with increasing numbers of workflow definitions, a massive surge in monthly workflow executions (reaching 420 million), and a growing demand for significantly larger workflows, moving from ~2,500 to 30,000 tasks per workflow. These challenges highlight common problems in managing highly dynamic, long-running distributed processes at enterprise scale.
The evolution of Conductor from versions 1.0 through 3.0 involved several strategic architectural shifts to cope with growing demands. Initially, execution data was stored in Dynomite, later migrated to Cassandra for better scalability and reliability. Large task inputs and outputs were offloaded to Amazon S3 to prevent database bloat and improve performance. Timestone replaced DynoQueues for queuing mechanisms, and Kafka was introduced to decouple indexing from the critical execution path. For indexing and long-term storage, Elasticsearch and Iceberg were integrated. These changes demonstrate a common pattern in scaling distributed systems: leveraging specialized data stores for specific use cases (e.g., S3 for large objects, Kafka for decoupled messaging, Cassandra for high-throughput operational data).
Conductor 4.0 specifically targeted workflow evaluation as the primary bottleneck. Earlier versions loaded the *entire* workflow state into memory for evaluation, which became unsustainable as workflows grew in size (e.g., a 1.7 MB workflow with 5,000 tasks consuming 5 GB of JVM heap). The redesign introduces a crucial optimization: separating workflow metadata from task and user data. The evaluator now uses a lightweight workflow blueprint and only loads the task data necessary for the *next decision*, significantly reducing memory pressure and latency. This
Lazy Loading for Workflow State
A key takeaway from Conductor 4.0 is the implementation of lazy loading for workflow state. Instead of loading the entire workflow definition and all task data into memory at once, the system now loads only the minimal blueprint and fetches task-specific data on-demand. This pattern is highly effective for large, complex state machines or workflows to improve performance and resource utilization.
These improvements highlight best practices for building highly concurrent and scalable distributed systems by minimizing shared mutable state, favoring asynchronous operations, and implementing intelligent data access patterns.