Uberは6年間の開発期間を経て、Cadenceと名付けられたワークフロー・オーケストレーション・プラットフォームのメジャーバージョンをリリースした。Uberや他の企業は、ネイティブのプログラミング言語を使ってステートフルなサービスを大規模に構築するためにCadenceを使用している。チームは、使いやすさ、オブザーバビリティ、効率性の向上を目標に次のリリースに取り組んでいる。
Cadenceは、ワークフロー・オーケストレーションのためのオープンソースのプラットフォームだ。この種の他のシステムと同様、複雑なステートフルなワークフローを、効率性と信頼性を念頭に置いて、大規模に処理するのに役立つ。類似のプラットフォームとは異なり、ワークフローはJavaやGo(公式にサポート)、Python、Ruby(コミュニティにてサポート)などのプログラミング言語で直接定義される。
Uber社のシニア・マネージャーであるEnder Demirkaya氏は、オーケストレーション・ワークフロー構築に対するCadenceのアプローチの理由をこう説明する。
従来、ワークフローはタスクの順序や依存関係を定義するDSLやコンフィグを使って書かれてきた。このアプローチは、ワークフローのオーケストレーションをよりシンプルにする一方で、ユーザーがワークフローでできることを制限し、DSLやコンフィグを実用的でないレベルまで過度に複雑にした。「使用事例と複雑さが増すにつれ、ワークフローをネイティブなプログラミング言語でプログラムを書くように自由に書く必要があることが証明された。」コンフィグやDSLの代わりに、プログラミングもソフトウェアエンジニアにとって自然な思考方法である。
典型的なCadenceアプリケーションは、Cadenceサービス、ワークフローとアクティビティ・ワーカー、外部クライアントで構成される。Cadenceサービス以外のコンポーネントはアプリケーション固有であり、ワークフローの定義や設定、ワークフローのステップ実行を担当している。
Cadence サービスは、gRPCAPI を備えた拡張性の高いマルチテナント・システムであり、バージョン管理されたワークフロー定義の保存や、アプリケーション所有のワーカーへのワークフロー・タスク実行のディスパッチなど、ワークフロー・オーケストレーションのコア機能を提供する。また、ステートレスAPIフロントエンドや、アーカイブのようなCadence固有のワークフローを実行するための内部ワーカーも提供する。Cadenceサービスは、Uberの典型的なデプロイメントでは100以上のアプリケーションをサポートできる。ローカル開発では、Dockerを使用したローカルのCadenceインスタンスが使用される。
![](https://imgopt.infoq.com/fit-in/1200x2400/filters:quality(80)/filters:no_upscale()/news/2023/08/uber-cadence-workflow-platform/en/resources/1160308507-2854a98a-0582-4748-87e4-e0695d3b6e86 Large-1691344852273.jpeg)
Cadenceデプロイのトポロジー(出典:Cadenceドキュメント)
Cadenceサービスは、データを永続データストアに保存し、Apache Cassandra、MySQL、PostgreSQL、CockroachDB、TiDBをサポートしている。さらに、高度な検索機能のためにElasticSeach やOpenSearchクラスタを使用できる。
Uberでは、Cadenceは1,000以上のサービスを強化し、月に120億以上のワークフロー実行を管理している。このプラットフォームは、マイクロサービスのオーケストレーション、バッチ処理、分散クーロン、分散シングルトン、データパイプライン、モデルトレーニングなど、様々な使用例に利用されている。
1.0リリース後、チームは、ドキュメント、コードサンプル、アプリケーションコードの品質チェックを改善し、運用と開発分野を含むユーザビリティを向上させたいと考えている。さらに、報告されるメトリクス、利用可能なアラート、ウェブインターフェースとのより良い統合を拡大するために、オブザーバビリティの改善を計画している。最後に、チームはデータベースの負荷を下げ、ストレージ容量を増やすことに取り組む予定だ。
CadenceはUberで開発されたオリジナルのオープンソースプロジェクトだが、Temporalを含め700以上のフォークが存在する。