エンジニア必見!分散システムを楽にするConductor入門:居酒屋から始めるオーケストレーション


エンジニア必見!分散システムを楽にするConductor入門:居酒屋から始めるオーケストレーション

conductor-oss/conductor

2025-08-13

大将、ちょっと聞いてくれよ!このConductorってやつが、俺たちの仕事にめっちゃ役立ちそうなんだ。

Conductorは、複雑なワークフローを管理するための強力なオーケストレーションプラットフォームだ。マイクロサービスを組み合わせて一つの大きな処理を実行するとき、サービスの呼び出し順序や、途中でエラーが起きたときのリカバリ処理を自動でやってくれるんだ。例えるなら、居酒屋の大将が、お客さんの注文(ワークフロー)を受けて、焼き鳥担当、刺身担当、ドリンク担当(マイクロサービス)に的確に指示を出し、どのタイミングで何を作るか、もし材料が切れたらどうするか、といった全体を仕切る役目を自動でやってくれるようなもんだ。

新米
先輩、それって具体的にどう便利なんすか?全部自分でコード書けばいいんじゃないっすか?

先輩
お、いい質問だ。自分で書くこともできるが、それだとめちゃくちゃ大変になるんだ。Conductorを使うと、こんなメリットがある。

分散システムの管理が簡単になる
マイクロサービスが増えると、それぞれのサービス間の通信や状態管理が複雑になる。Conductorは、この「誰が、何を、いつ、どうやって」というのをブループリント(設計図)として定義できる。これによって、コードの可読性が上がり、管理が楽になるんだ。

障害に強いシステムが作れる
ワークフローの途中でサービスがダウンしたり、タイムアウトしたりすることがあるだろ?Conductorは、そういう場合に自動でリトライしたり、失敗した処理をやり直したりする機能を持っている。これのおかげで、エンジニアはエラーハンドリングのロジックをいちいち自分で書かなくて済むようになる。まるで、大将が「あ、あの客の注文、焼き鳥がまだ来てないな!もう一回作り直してくれ!」って自動で指示を出してくれる感じだな。

スケーラブルなシステムになる
Conductorは分散型アーキテクチャで動くから、ワークロードに応じて柔軟にスケールできる。大量のワークフローを並行して処理できるので、サービスの負荷が増えても安定して動かし続けられるんだ。

先輩
よーし、じゃあ実際にどうやって使うか見ていこうか。

Conductorの導入は、主にDockerを使って手軽に始めることができる。

Dockerコンテナを起動する

まず、docker-composeファイルを用意して、Conductorのサーバーとデータベース(Redis、Elasticsearchなど)を起動する。

version: '3'
services:
  conductor-server:
    image: conductor-oss/conductor-server:latest
    ports:
      - "8080:8080"
    environment:
      - CONDUCTOR_CONFIG_DIR=/app/config
    volumes:
      - ./config:/app/config
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2
    ports:
      - "9200:9200"
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
  redis:
    image: redis:6.2-alpine
    ports:
      - "6379:6379"

このdocker-compose.ymlを使って、コンテナを起動する。

docker-compose up -d

ワークフローを定義する

次に、ワークフローの設計図(ブループリント)をJSON形式で定義する。これは、どのタスク(マイクロサービスが実行する処理)を、どのような順序で実行するかを指定するものだ。

{
  "name": "payment_processing_workflow",
  "version": 1,
  "tasks": [
    {
      "name": "get_user_info",
      "taskReferenceName": "get_user_info_ref",
      "type": "SIMPLE",
      "inputParameters": {
        "userId": "${workflow.input.userId}"
      }
    },
    {
      "name": "process_payment",
      "taskReferenceName": "process_payment_ref",
      "type": "SIMPLE",
      "inputParameters": {
        "amount": "${workflow.input.amount}",
        "userEmail": "${get_user_info_ref.output.email}"
      }
    },
    {
      "name": "send_confirmation_email",
      "taskReferenceName": "send_email_ref",
      "type": "SIMPLE",
      "inputParameters": {
        "email": "${process_payment_ref.output.email}",
        "message": "Payment successful for amount ${process_payment_ref.output.amount}"
      }
    }
  ]
}

この例では、ユーザー情報を取得し、決済を処理し、確認メールを送るという一連の流れを定義している。

タスクを実行するワーカーを実装する

各タスク(get_user_info, process_payment, send_confirmation_email)を実際に実行するワーカー(マイクロサービス)を実装する。ここでは、JavaScript(Node.js)の例を見てみよう。

const { ConductorClient } = require('conductor-client-js');

// Conductorクライアントを初期化
const conductorClient = new ConductorClient({
  serverUrl: 'http://localhost:8080/api'
});

// ワーカーを登録
conductorClient.registerWorkers([
  {
    taskDefName: 'get_user_info',
    execute: async ({ inputData }) => {
      // ユーザーIDから情報を取得する処理
      console.log(`Getting user info for userId: ${inputData.userId}`);
      return {
        status: 'COMPLETED',
        outputData: {
          email: '[email protected]',
          name: 'Test User'
        }
      };
    }
  },
  {
    taskDefName: 'process_payment',
    execute: async ({ inputData }) => {
      // 決済処理
      console.log(`Processing payment for amount: ${inputData.amount} from user: ${inputData.userEmail}`);
      return {
        status: 'COMPLETED',
        outputData: {
          transactionId: '12345',
          amount: inputData.amount,
          email: inputData.userEmail
        }
      };
    }
  },
  {
    taskDefName: 'send_confirmation_email',
    execute: async ({ inputData }) => {
      // メール送信処理
      console.log(`Sending confirmation email to: ${inputData.email} with message: ${inputData.message}`);
      return {
        status: 'COMPLETED',
        outputData: {
          messageStatus: 'SENT'
        }
      };
    }
  }
]);

// ワーカーを開始
conductorClient.start();
console.log('Workers started!');

このコードでは、Conductorサーバーと通信して、特定のタスクを待ち受けるワーカーを実装している。

ワークフローを開始する

最後に、定義したワークフローをAPI経由で開始する。

curl -X POST 'http://localhost:8080/api/workflow' \
-H 'Content-Type: application/json' \
-d '{
  "name": "payment_processing_workflow",
  "version": 1,
  "input": {
    "userId": "123",
    "amount": 1000
  }
}'

このcurlコマンドを実行すると、Conductorがブループリントに従って、一連の処理を順番に実行してくれるんだ。

大将
へぇ、すげぇな!つまり、俺が新しいメニュー(ワークフロー)を考えたら、あとは自動で各担当が動いてくれるってことか!

先輩
そういうこと!このConductorを使えば、俺たちはもっと本質的な部分、つまり「どんなサービスを作るか」に集中できるってわけさ。


conductor-oss/conductor




ソフトウェアエンジニア必見! MCPでAI開発の密室を突破する

おいおい、一体どういうことだ!? この部屋は完全に密室じゃないか!…おっと、すみません。ついドラマの役に入り込んでしまいました。でも、この密室、実は我々ソフトウェアエンジニアの目の前にある「AI開発の密室」かもしれません。「ん? AIの密室ってどういうこと?」と、あなたは首を傾げていますね。ご説明しましょう。


MinIO代替?「rustfs/rustfs」で高性能ストレージを構築する!

(舞台はとあるIT企業の開発室。エンジニアのAさんとBさんがストレージの課題に頭を抱えている。)Aさん 「はぁ〜、またストレージがパンパンだよ…。データが増えるのは嬉しいんだけど、管理が大変だし、レスポンスも遅い時があるんだよなぁ。もっと『うまい、早い、安い』ストレージはないもんかな…。」


エンジニア必見!「Web-Dev-For-Beginners」で広がるスキルとキャリアの可能性

microsoft/Web-Dev-For-Beginners ですね!ソフトウェアエンジニアの視点から、これがどれだけ役に立つか、そしてどう導入して活用していくかを、フレンドリーに解説しますね!「Web-Dev-For-Beginners」という名前の通り、ウェブ開発の「初心者向け」コンテンツなんですが、実はこれ、ベテランのソフトウェアエンジニアにとっても、めちゃくちゃ価値があるんです!


分散型Webアプリの新境地!HeyPuter/puterで始める次世代開発

「HeyPuter/puter」は、一言で言うと「ブラウザ上で動くオペレーティングシステム(OS)」です。でも、ただのOSじゃありません。これはインターネットを基盤とした、分散型Webアプリケーションを構築するためのオープンソースのフレームワークなんです。JavaScriptを書いて、ブラウザ上で動くOSのような環境を作り、ファイルシステム、ウィンドウ管理、GUIツールキットなどを活用することができます。これは、まるでブラウザの中に、自分だけの「パソコン」を作るようなイメージですね。


Testcontainers導入ガイド:Javaテストにおける環境依存性の悩みを解消する魔法のライブラリ

今回解説するのは、Javaのテストの世界で絶大な人気を誇るライブラリ、Testcontainersです。Testcontainersは、Javaのユニットテストや統合テストをサポートするためのライブラリです。「推し」がDockerコンテナで動かせるものなら、どんなものでも、テストのためだけに、手軽に立ち上げ、使い終わったら綺麗に片付けてくれる、まるで敏腕マネージャーのような存在です。


開発効率を劇的に向上!エンジニア必携のユーティリティツール集「it-tools」徹底活用ガイド

CorentinTh/it-toolsは、名前の通り、IT(情報技術)に携わる人々、特に開発者のために作られた、便利なオンラインツールをまとめたコレクションです。これはWebベースで動作するオープンソースプロジェクトで、以下のような特徴があります。


ダイエット中の俺が解説!Frappe/HRMSで実現するスマート人事!

今日はね、みんながソフトウェアエンジニアとしてバリバリ働く上で、とっても役に立つかもしれない強力なツール、その名も「frappe/hrms」について、コント風に解説していくぞ!ダイエット中の俺と一緒に、この素晴らしいオープンソースHR・給与計算ソフトウェアの魅力に迫ってみよう!


彼女のランジェリー選びとESLintのコント

彼女のランジェリー選び、さながら複雑なJavaScriptのコードですね! どれも魅力的に見えるけど、サイズが合わなかったり、着心地が悪かったり、合わせる服が難しかったり…。ESLintは、そんな彼女の悩みを解決するあなたの最高のパートナーです。 彼女が素敵なランジェリーを選べるよう、あなたはESLintを使って、プロの視点からアドバイスをしてあげられます。


Web開発の時短術 Bootstrapで叶える爆速デザイン

今日はBootstrapについて、ソフトウェアエンジニアの視点から、その魅力と使い方をたっぷりお伝えしますね。Web開発の世界では、これを知らないとちょっと乗り遅れちゃうかも?というくらい、とっても人気のあるフレームワークなんですよ。一言で言うと、Webサイトの見た目を整えるための道具箱です。


酒の飲み比べのように味わうSPlayer:シンプルに潜むエンジニア的メリット

SPlayerは、imsyy/SPlayerというGitHubリポジトリで公開されている、シンプルで使いやすいウェブベースの音楽プレイヤーです。まるで日本酒の飲み比べで、特定の銘柄(音楽プレイヤー)がどんな特徴(機能)を持っているかをじっくりと味わうように、SPlayerをソフトウェアエンジニアの視点から紐解いてみましょう。