エンジニア必見!分散システムを楽にする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の密室ってどういうこと?」と、あなたは首を傾げていますね。ご説明しましょう。


バグに疲れたJava開発者へ贈る、Spring AIベースの「賢いチーム」構築法

私も「またバグかよ!」って叫びたくなる気持ち、よーく分かります。そんなバグ潰しに疲弊した心を癒し、次の段階、つまり「バグを生み出す前に、賢い自動化エージェントに任せちゃおう」という世界へ導いてくれるかもしれないのが、今回解説する 「アリババクラウドが提供する、Spring AIベースのエージェントAIフレームワーク」です!


freeCodeCamp:あなたのキャリアを変える無料プログラミング学習の決定版!

突然ですが、あなたはこんな風に思っていませんか?「プログラミングを学びたいけど、何から始めたらいいか分からない…」 「スキルアップしたいけど、お金がかかるのはちょっと…」 「実戦で使えるコードを書きたいけど、どこで経験を積めばいいの?」もし、一つでも当てはまるなら、今日の放送はあなたのためにあります!


ふらっと立ち寄った居酒屋で聞く、Prisma入門

「Prisma」ってのはよ、まぁ、あの、えーと… 「データベースと仲良くなるためのすごいヤツ」 だな!いや、もっとちゃんと話すと、「次世代のORM(Object-Relational Mapper)」 ってやつだよ。ORMってのは、データベースのテーブルとかを、JavaScriptとかのプログラムで扱うオブジェクト(クラスとか)にしてくれる魔法の道具って思ってくれや。


JavaScriptエンジニア必見!Reactの核心:Hooksとコンポーネント指向による状態管理の最適解

Reactは、Facebook(現Meta)によって開発された、Webおよびネイティブのユーザーインターフェース(UI)を構築するためのJavaScriptライブラリです。Reactが現代のウェブ開発で非常に人気があるのには、いくつかの大きな理由があります。


「DBの構造、見つけたり!」drawdbで実現する設計の見える化とコミュニケーション革命

あなたのおっしゃる drawdb-io/drawdb というツールは、データベース設計を行うソフトウェアエンジニアにとって、すごく便利で強力な味方になってくれます。この記事では、それを 「DB図作成のスペシャリスト」 と呼んで解説していきますね!


バグ潰しに疲れたエンジニアへ:DirectusでAPI/CMS開発を終わらせる方法

ああ、バグ潰し. ..。コードと格闘するソフトウェアエンジニアなら誰もが通る道ですよね。そのお疲れ、よくわかります。「またこのAPIの認証設定か. ..」「DBスキーマの変更が全プロジェクトに響く. ..」「管理画面のデザイン修正、いつまでやるんだ!」と、コントのように叫びたくなるときもありますよね。


面接官を唸らせる!ローカル完結型PDFツール「Stirling-PDF」徹底解説

面接官本日は当社の面接にお越しいただき、ありがとうございます。面接官の山田と申します。あなた本日は貴重な機会をいただき、誠にありがとうございます!エンジニアの佐藤と申します!面接官佐藤さん、今日は何かユニークな技術について、ご自身の言葉でプレゼンしていただきたいのですが、よろしいでしょうか?


ガシャポン攻略法:TanStack RouterでReactのルーティングを制覇する

TanStack Routerは、Reactアプリケーションでルーティングを管理するための、強力で型安全なライブラリです。単にページを切り替えるだけでなく、もっと複雑な要件にも対応できる、まさに「ガシャポンの攻略法」のようなライブラリです。


さよなら、データ処理バグ!ThingsBoardのルールエンジンで叶えるノーコードIoTロジック

ThingsBoardは、その名の通り「モノ」のデータを扱うための強力なオープンソースのIoTプラットフォームです。特に、データ収集、処理、そして「見える化」に特化しており、ソフトウェアエンジニアの視点から見ると、非常に頼りになるツールと言えます。