コンテンツへスキップ

KnativeとKogitoによるイベントオーケストレーション

公開日:2020-12-16 、改訂日:2024-01-17

KnativeとKogitoによるイベントオーケストレーション

著者:Red HatのプリンシパルソフトウェアエンジニアであるRicardo Zaniniと、Red Hatのソフトウェア開発者であるTihomir Surdilovic

Kogitoは、クラウドネイティブなビジネスオートメーションアプリケーション開発のためのプラットフォームです。クラウドネイティブアーキテクチャをターゲットとして設計されており、アーキテクトと開発者がビジネスアプリケーションを簡単に作成するためのさまざまな機能が備わっています。

Kogitoは、イベント駆動型のサーバーレスアプリケーションをオーケストレーションするワークフロモデルを定義するための仕様であるCNCF Serverless Workflowプロジェクトを実装しています。これは、複数のクラウドとコンテナプラットフォームで使用できる、ベンダーニュートラルでプラットフォームに依存せず、宣言的なワークフロモデルを定義することに重点を置いています。現在、Serverless Workflow仕様はCNCFサンドボックスプロジェクトです。

Serverless Workflow実装の一環として、KogitoはこれらのワークフローをKnativeでデプロイするためのKubernetesオペレーターを提供します。目標は、クラウド環境でユーザー定義のワークフローをできるだけ簡単にデプロイおよび管理することです。Knative Eventingは、イベント駆動型アーキテクチャの基盤となるインフラストラクチャを提供することで、このシナリオで非常に重要な役割を果たします。

Kogito Serverless Workflow

Knativeのイベント駆動型アーキテクチャでKogitoワークフロ実装がどのように機能するかを示すために、患者オンボーディングの例を使用します。この例では、病院で新しい患者をオンボードし、適切な医師に割り当てるために使用されるワークフローをシミュレートします。

仕様の例ページから取得した次の画像は、このワークフローを示しています。

患者オンボーディングワークフロー表現 患者オンボーディングワークフロー表現

このワークフローは、患者の情報を含むCloudEventオブジェクトを受信した後に開始されます。その後、仕様で順番に3つの関数が呼び出され、(1)患者の情報を保存し、(2)症状に基づいて患者を医師に割り当て、(3)その患者に割り当てられた医師との予約をスケジュールします。

ここに、この仕様に基づいた患者オンボーディングワークフローのYAMLの例を示します。

id: onboarding
version: '1.0'
name: Patient Onboarding Workflow
states:
- name: Onboard
  type: event
  start:
    kind: default
  onEvents:
  - eventRefs:
    - NewPatientEvent
    actionMode: sequential
    actions:
    - functionRef:
        refName: StoreNewPatient
    - functionRef:
        refName: AssignPatientToDoctor
    - functionRef:
        refName: SchedulePatientAppointment
  end:
    kind: default
events:
- name: NewPatientEvent
  type: new.patient.events
  source: "/hospital/entry"
functions:
- name: StoreNewPatient
  operation: classpath:openapi.json#storeNewPatient
- name: AssignPatientToDoctor
  resource: classpath:openapi.json#assignPatientToDoctor
- name: SchedulePatientAppointment
  resource: classpath:openapi.json#schedulePatientAppointment

上記のワークフロー定義は3つの部分に基づいています。最初の部分は、ワークフロー制御フローロジックを含むstates配列です。この場合、新しい患者のCloudEventを受信し、前に述べた3つの関数を実行するeventです。

ワークフローの2番目の部分は、CloudEvent仕様に基づくイベント定義を含むevents配列です。ワークフローでイベントが定義されている方法と、CloudEvent形式で表現されている方法の間には1対1のマッピングがあります。

3番目の部分であるfunctions配列には、必要なサービスを実行する方法に関する情報をランタイムにもたらす関数定義が含まれています。

Serverless Workflow仕様は標準ベースであり、OpenAPI仕様を利用してサービスのリラックス実行に関する詳細を定義します。このgistでは、上記の例で関数が参照するOpenAPIファイルを確認できます。

仕様が提供するすべての言語構成に関する情報は、Serverless Workflow仕様を参照してください。

仕様ではJSONとYAMLのワークフロー形式の両方が許可されていることに注意してください。この例ではYAMLを使用していますが、JSONは同等と見なされ、ランタイムでも解析可能です。

コンパイル時に、KogitoランタイムはこのYAMLファイルを解析し、このワークフロー定義を表すJavaコードを生成します。生成されたコードはQuarkusフレームワークに基づいています。結果は、アーキテクチャのどこにでもデプロイできるOpenAPI標準RESTサービスです。

Kogitoランタイムワークフロー解析プロセス Kogitoランタイムの解析フロー

この例では、Knative Kogito Eventingプラグインもプロジェクトに追加しています。つまり、ルートパスでHTTP経由でCloudEventオブジェクトを受け入れることができます。例えば

$ curl -X POST \
      -H "content-type: application/json"  \
      -H "ce-specversion: 1.0"  \
      -H "ce-source: /hospital/entry"  \
      -H "ce-type: new.patients.events"  \
      -H "ce-id: 12346"  \
      -d "{ \"name\": \"Mick\", \"dateOfBirth\": \"1983-08-15\", \"symptoms\":[\"seizures\"]}" \
http://localhost:8080

このリクエストをサービスに送信すると、ワークフローの新しいインスタンスが開始され、仕様で定義されているすべての操作が実行されます。

この例には他にも多くのものが含まれています。デプロイと構築方法に関する包括的な手順については、Githubリポジトリの例ページを参照してください。

Knative Eventing統合

この生成されたサービスに基づいて、イメージを構築し、Kogitoオペレーターを使用してKnative EventingがインストールされたKubernetesクラスタにデプロイできます。オペレーターは、このサービスを構成し、Knative ブローカーにサブスクライブするために必要なすべてのKnativeリソースを作成します。

KnativeとKogitoの統合 Knative EventingとKogito Operatorの統合

Kogito Operatorは、サービスとブローカーを連携させるKnativeのトリガーリソースを作成します。この例では、new.patients.eventsタイプのイベントをフィルタリングします。つまり、このタイプの新しいイベントがブローカーに届くたびに、Kogitoサービスにリダイレクトされます。

同じ概念は、ワークフローエンジンによって生成されたイベントにも適用されます。この場合、OperatorはKnativeのSinkBindingリソースを作成し、それをKnativeブローカーにバインドします。サービスによってイベントが生成されるたびに、それを表すCloudEventがブローカーに送信されます。下の図は、SinkBindingを介してKnativeブローカーにイベントを送信するKogitoサービスの実装の詳細を示しています。

KnativeとKogitoの統合 Knative EventingとKogitoサービスのイベントプロデューサー

結論

Serverless Workflow仕様は、多くのプラットフォームやクラウドプロバイダーで使用できる複雑なワークフローを定義するのに役立ちます。この記事では、Knativeをサーバーレスプラットフォームとして、Kogitoでこの仕様を使用する方法と、その可能性について説明しました。

仕様の実装はKogitoプロジェクトで進行中の作業ですが、私たちの目標は、標準と仕様に完全に準拠したプラットフォームを実現することです。

この記事で紹介したをローカル環境でお試しいただけます。より高度なシナリオを探している場合は、KogitoとKnative Eventingを使用したGithub Botの例をご覧ください。

参考資料

Serverless Workflow仕様の詳細については、Githubリポジトリの仕様書をお読みいただき、コミュニティに参加することをお勧めします!

Knative Eventingの詳細と、Kubernetes上でイベント駆動アーキテクチャを作成するのにどのように役立つかについては、公式ドキュメントをご覧ください

著者について

Ricardo Zaniniは、現在Kogitoコミュニティプロジェクトで働くソフトウェアエンジニアです。2000年からソフトウェアエンジニアリングの分野で活躍しており、CNCF Serverless Workflow Specificationのメンテナーでもあります。

Tihomir Surdilovicは、Red Hatでビジネスオートメーションに取り組むソフトウェア開発者です。2008年からビジネスオートメーションとオープンソースに関わっており、CNCF Serverless Workflow Specificationのアクティブなリードも務めています。

サイトトラフィックを理解するために、分析とCookieを使用しています。その目的で、サイトの使用に関する情報はGoogleと共有されます。詳細はこちら。