Rubellum fly light

ほぼPHP日記

HTTPリクエストを手順に送るだけの小さなワークフローエンジンを作って試行錯誤中

ライティングソフトウェアを読んで、サービス指向なアーキテクチャでクローラを作っています。

サービス指向なアーキテクチャの簡易図
サービス指向なアーキテクチャの簡易図

この中で〜Managerはワークフローエンジンによって処理を順に実行するだけのサービスとなっています。

処理自体は主に下位の〜Accessに対して手順通りにリクエストを投げるだけです。

このワークフローエンジンは自前実装でなく3rd Partyツールを使うのがライティングソフトウェア的には筋ですが、仕組み的に素朴なものがほしかったのでRubyで自前実装することにしました。

※コードは今のところ公開していません。

元々はGoogle Workflows、その後VM移動した都合でOSSのn8nを使っていました。

自前な素朴ワークフローエンジンは次のようなyamlを定義してリクエストを順に送ります。

miniflow:
  # ソースクロールキューを生成する
  - name: search-source_crawl_queue
    url: http://localhost:8080/v1/source/search
    params:
      condition:
        type: rss
        schedule_with:
          type: hourly
        limit: 100
      format:
        type: crawl_job
        opts:
          skip_enqueue_if_exists_entry: false
    result: crawl_job_get_result

  # ソースクロールキューを追加する
  - name: crawl_job-add
    url: http://localhost:8080/v1/crawl_job/add
    params:
      crawl_jobs: ${result.crawl_job_get_result.result.items}

${〜}で変数を埋め込めるようにして、前の実行結果を引き継げるようにしました。

リクエストの方法は今のところPOSTのみでHTTPリクエストのBODYにJSONを記述して送るだけの仕組みになっていますが、 このあたりはパラメータでいくらでも拡張できるので必要になったら作ればいいと考えています。

APIをうまく設計すればHTTPリクエストを順に送るだけで柔軟に機能を実現できます。

まだ、サービスが4個、APIが2〜30本くらいの規模感のソフトウェアしか作っていませんが、設計の感触はなかなかいいです。