ホームページ  >  記事  >  Java  >  新しい Conductor Java クライアント v4 の発表

新しい Conductor Java クライアント v4 の発表

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-14 16:08:31317ブラウズ

Announcing the New Conductor Java Client v4

作成者: Miguel Prieto


今年の初めに、Python SDK が大幅に刷新されました。現在、他の Conductor SDK も大幅な再構築が行われており、大幅な設計の強化、パフォーマンスの向上、最適化された依存関係を備えた Java Client v4 を発表できることを嬉しく思います。

Java クライアント v4 では、設計を改善することで依存関係のフットプリントを削減しました。直接の依存関係を削除するために、フィルター、イベント、リスナーを追加しました。この設計上の決定は、クライアントの使用、拡張、保守を容易にするために慎重に検討された結果行われました。

さらに詳しくお読みください!


なぜこれを行うのでしょうか?

私たちは皆さんからのフィードバックを聞き、開発者のエクスペリエンスを向上させるために取り組んでいます。 Orkes と Conductor OSS コミュニティは 2 つの別々の Java クライアント/SDK プロジェクトを管理していましたが、どちらも業界の多くのプロジェクトと同様に、技術的負債が蓄積していました。私たちは、この負債に対処する適切な時期が来たと判断しました。

すぐに対処したい主な事項は次のとおりです。

  1. 1 つの Conductor Java クライアント (すべてを制御するため)
    目標は、2 つの既存のプロジェクトを、それぞれの最も強力な要素を取り入れて、より管理しやすい統合ソリューションに統合することでした。これにより、アップデートの高速化、サポートの向上、より一貫した開発エクスペリエンスが実現されるはずです。

  2. 依存関係の最適化
    コードのクリーンアップの一環として、いくつかの依存関係を削除しました:

    • バックエンド コードの依存関係 - 以前の OSS Java クライアントと SDK プロジェクトは Conductor OSS リポジトリの一部であり、conductor-commons に依存していました。これにより、バックエンド/クライアント モデルの同期が保たれましたが、バックエンド関連のコードと依存関係の一部がクライアントに漏洩することも意味しました。
    • 非推奨のアーティファクトへの依存関係。
    • 必要のないものへの依存。

    ハードコーディングされた依存関係を削除することで、ユーザーと寄稿者は特定のライブラリやツールにロックされることなくクライアントを拡張できます。

  3. さらなるモジュール化
    モジュール性を高めるためにプロジェクトを再構築し、クライアントがより柔軟でカスタマイズしやすくなりました。

    このモジュール式アプローチを使用すると、イベント、リスナー、フィルターを通じて、好みの監視、ロギング、または検出ツールを統合できます。これにより、カスタマイズが簡素化されるだけでなく、コードベースの保守性と将来性が向上し、開発者が必要に応じて独自の拡張機能を構築および拡張できるようになります。

  4. コードのクリーンアップ/リファクタリング
    よりクリーンなコードベースにより、今後の開発はより迅速になり、エラーが発生しにくくなり、コミュニティへの貢献も容易になります。

  5. より良い例
    特に例として、プロジェクト内にモジュールを導入しました。まだ開発中ですが、このモジュールは、これから始めようとしている場合でも、高度な使用例を探している場合でも、実用的な実際の例の中心的なリソースとして機能します。

ホームスイートホーム

公式 Conductor クライアントと SDK は現在、https://github.com/conductor-sdk に格納されています。ただし、Conductor OSS リポジトリ https://github.com の一部である OSS Java クライアント/SDK は例外です。 /orkes-io/orkes-conductor-client/tree/main.

今後、すべての Conductor クライアントと SDK は、最終的には conductor-oss/conductor リポジトリの同じ conductor-clients ディレクトリに格納されることになります。そこにアクセスして、Java クライアント/SDK v4 のソース コードを見つけてください。

Java クライアント v4 の新機能は何ですか?

1. 最適化された依存関係

Java Client v4 では、置き換えられる 2 つのプロジェクトと比較して、より合理化された効率的な依存関係セットが導入されています。

未使用、非推奨、不要な依存関係をすべて削除し、クラスパス汚染を大幅に削減しました。 この最適化により、ライブラリ間の競合のリスクが最小限に抑えられるだけでなく、全体的なパフォーマンスと保守性も向上します。 v4 は、依存関係ツリーを簡素化することにより、より使いやすく、よりスムーズにプロジェクトに統合できる、よりクリーンで軽量なクライアントを提供します。

2. 新しいタスクランナー

TaskRunner がリファクタリングされました。 TaskPollExecutor は、ワーカーがタスクのポーリング、実行、更新に使用するスレッド プールを管理するという同じ中核的な役割を共有しているため、TaskPollExecutor に代わるものです。

これにより、Netflix Eureka と Spectator への直接の依存関係が削除され、イベント駆動型のメカニズムが導入され、ポーリングを行うかどうかを決定するコールバックである PollFilter が追加されました。さらに、エラー処理と同時実行性の管理が改善されました。

Eureka と Spectator を使用している場合は、心配する必要はありません。イベントとフィルターは、これらの優れたツールやライブラリとシームレスに統合するために提供されています。

3. イベント、リスナー、フィルターを使用した拡張性

Java クライアント v4 では、イベント、リスナー、フィルターを通じて拡張性が強化されています。これらは、メトリクスの追跡、ログ記録、監査、特定の条件に基づくカスタム アクションのトリガーなど、さまざまな目的に使用できます。

たとえば、Lambda 関数を PollFilter として使用して、Eureka によって報告されたインスタンスのステータスを確認できます。インスタンスが UP としてマークされている場合 (つまり、Eureka がインスタンスが正常で利用可能であるとみなしている場合)、ワーカーはタスクのポーリングを続行します。

さらに、PollCompleted イベントを処理するためにリスナーを登録できます。このシナリオでは、リスナーはイベントの詳細をログに記録し、Prometheus を使用してポーリング プロセスの期間を追跡し、詳細なメトリクスを追跡するためのラベルとしてタスク タイプを添付します。このアプローチにより、柔軟性が高まるだけでなく、クライアントの動作の可観測性と制御も向上します。

var runnerConfigurer = new TaskRunnerConfigurer
        .Builder(taskClient, List.of(new HelloWorldWorker()))
        .withThreadCount(10)
        .withPollFilter((String taskType, String domain) -> {
            return eurekaClient.getInstanceRemoteStatus().equals(InstanceStatus.UP);
        })
        .withListener(PollCompleted.class, (e) -> {
            log.info("Poll Completed {}", e);
            var timer = prometheusRegistry.timer("poll_completed", "type", e.getTaskType());
            timer.record(e.getDuration());
        })
        .build();

runnerConfigurer.init();

クライアントには、これらのイベントやリスナーの上に構築された MetricsCollector などの特殊なインターフェイスもいくつかあります。メトリクス コレクターの具体的な実装を間もなく提供する予定です。

4. OkHttp3 v4 — 適切な量の機能 OOTB

OkHttp3 v4 は、Java 用の最も人気があり、評判の高い HTTP クライアントの 1 つです。 Java クライアント/SDK v4 にアップグレードすると、すぐに使用できる HTTP2 と Gzip がサポートされるようになり、より迅速な HTTP リクエストやデータ転送が可能になります。他にも優れたオプションはありますが、シンプルさ、パフォーマンス、信頼性のために OkHTTP が選択されました。

OkHttp のアップグレードに伴い、抽象化レイヤーの 1 つである Jersey を削除することも決定しました。 Jersey は、OkHttp のような単純な HTTP クライアントと比較して、機能が豊富ですが、重量も大きくなります。これらの機能の一部 (依存関係注入、フィルター、例外マッパーなど) は、基本的な HTTP リクエストを行うだけの場合は過剰になる可能性があります。

5. OSS から Orkes への移行の容易さ

クライアントは、オープンソース コミュニティへのサポートを第一に維持しながら、OSS Conductor と Orkes Conductor の間のシームレスな統合を促進し、ユーザーがニーズの進化に応じて柔軟に切り替えることができるようにします。

Orkes クライアント モジュールは、HeaderSupplier を介した認証を追加することで、単純に Conductor クライアントを拡張します。

Client v4 でワーカーを作成したが、Orkes Conductor を試してみたい OSS ユーザーの場合、orkes-conductor-client 依存関係をプロジェクトに追加し、OrkesAuthentication をヘッダー サプライヤーとして使用してクライアントをインスタンス化するだけです。 OSS に戻すのは、ヘッダー サプライヤーを削除するだけで簡単です。

var client = ConductorClient.builder()
                .basePath(BASE_PATH)
                .addHeaderSupplier(new OrkesAuthentication(KEY, SECRET))
                .build();
return new TaskClient(client); // Use this TaskClient with TaskRunner to initialize workers

Conductor OSS と Orkes Conductor の 6 つの違いを見つけてください。

6. サンプルとドキュメントの改善

私たちは、承認、ワークフローとタスク定義の管理、ワークフローのスケジュール設定などの主要な領域をカバーする改善を加えて、サンプルを専用モジュールに統合し始めました。このモジュールはまだ進行中ですが、より良いガイダンスを提供し、実際の使用例をカバーするために、サンプルを継続的に追加および改良していきます。

私たちの目標は、開発者がクライアント/SDK を効果的に使用し、モジュールの進化に合わせてベスト プラクティスを模索できるようにすることです。

Java クライアント v4 の使用を開始する

Java クライアント v4 の使用を開始する方法は次のとおりです:

ステップ 1: 導体をスピンアップする

Conductor OSS または Orkes Conductor を使用します:

  • Conductor OSS - ソースから実行するか、Docker を使用します。
  • Orkes Conductor—Orkes Playground を試すか、無料トライアルにサインアップしてください。

ステップ 2: コンダクターとクライアントの依存関係をプロジェクトに追加する

Gradle ベースのプロジェクトの場合:

implementation 'org.conductoross:conductor-client:4.0.0'
implementation 'io.orkes:orkes-conductor-client:4.0.0' // required if using Orkes Conductor

Maven ベースのプロジェクトの場合:

<dependency>
    <groupId>org.conductoross</groupId>
    <artifactId>conductor-client</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>io.orkes</groupId>
    <artifactId>orkes-conductor-client</artifactId>
    <version>4.0.0</version>
</dependency> <!-- Required if using Orkes Conductor –->

ステップ 3: ConductorClient インスタンスを作成する

import com.netflix.conductor.client.http.ConductorClient;

// … boilerplate or other code omitted
var client = new ConductorClient("http://localhost:8080/api");

Orkes Conductor を使用している場合は、アプリケーションを作成して資格情報を取得する必要があります。キー ID とシークレットを使用して、ConductorClient インスタンスを作成します。

import com.netflix.conductor.client.http.ConductorClient;
import io.orkes.conductor.client.http.OrkesAuthentication;

var client = ConductorClient.builder()
           .basePath("https://play.orkes.io/api")
           .addHeaderSupplier(new OrkesAuthentication(KEY, SECRET))
           .build();

または

import io.orkes.conductor.client.ApiClient;

var client = ApiClient.builder() // ApiClient extends ConductorClient
                 .basePath("https://play.orkes.io/api")
                .credentials(KEY, SECRET)
                .build();

ステップ 4: ワークフローを作成する

次の JSON を使用して Conductor でワークフローを作成できます:

{
  "name": "hello_workflow",
  "description": "Hello Workflow!",
  "version": 1,
  "tasks": [
    {
      "name": "hello_task",
      "taskReferenceName": "hello_task_ref",
      "type": "SIMPLE",
      "inputParameters": {}
    }
  ],
  "inputParameters": [],
  "outputParameters": {

  },
  "schemaVersion": 2,
  "restartable": true,
  "workflowStatusListenerEnabled": false,
  "ownerEmail": "example@orkes.io",
  "timeoutPolicy": "ALERT_ONLY",
  "timeoutSeconds": 0
}

または、SDK モジュールを使用してワークフローをコードとして作成します。そのためには、次の依存関係をプロジェクトに追加する必要があります:

Gradle ベースのプロジェクトの場合:

implementation 'org.conductoross:java-sdk::4.0.0'

Maven ベースのプロジェクトの場合:

<dependency>
    <groupId>org.conductoross</groupId>
    <artifactId>java-sdk</artifactId>
    <version>4.0.0</version>
</dependency>

依存関係を追加すると、次のコードを実行してワークフローを登録できます。

import com.netflix.conductor.sdk.workflow.def.WorkflowBuilder;
import com.netflix.conductor.sdk.workflow.def.tasks.SimpleTask;
import com.netflix.conductor.sdk.workflow.executor.WorkflowExecutor;

// … boilerplate or other code omitted
var executor = new WorkflowExecutor("http://localhost:8080/api");
var workflow = new WorkflowBuilder<Void>(executor)
        .name("hello_workflow")
        .version(1)
        .description("Hello Workflow!")
        .ownerEmail("examples@orkes.io")
        .add(new SimpleTask("hello_task", "hello_task_ref"))
        .build();
workflow.registerWorkflow(true, true);
executor.shutdown();

ステップ 5: ワークフローを開始する

ワークフローを登録したので、次のコードを使用してワークフローを開始できます。

import com.netflix.conductor.client.http.ConductorClient;
import com.netflix.conductor.client.http.WorkflowClient;
import com.netflix.conductor.common.metadata.workflow.StartWorkflowRequest;

var client = new ConductorClient("http://localhost:8080/api");
var workflowClient = new WorkflowClient(client);
var workflowId = workflowClient.startWorkflow(new StartWorkflowRequest()
        .withName("hello_workflow")
        .withVersion(1));

System.out.println("Started workflow " + workflowId);

Step 6: Run a worker

You need a worker polling for “hello_workflow” tasks and executing them to complete the workflow you started in Step 5.

For that, you can run this example:

import com.netflix.conductor.client.automator.TaskRunnerConfigurer;
import com.netflix.conductor.client.http.ConductorClient;
import com.netflix.conductor.client.http.TaskClient;
import com.netflix.conductor.client.worker.Worker;
import com.netflix.conductor.common.metadata.tasks.Task;
import com.netflix.conductor.common.metadata.tasks.TaskResult;

import java.util.List;

public class HelloWorker implements Worker {

    @Override
    public TaskResult execute(Task task) {
        var taskResult = new TaskResult(task);
        taskResult.setStatus(TaskResult.Status.COMPLETED);
        taskResult.getOutputData().put("message", "Hello World!");
        return taskResult;
    }

    @Override
    public String getTaskDefName() {
        return "hello_task";
    }

    public static void main(String[] args) {
        var client = new ConductorClient("http://localhost:8080/api");
        var taskClient = new TaskClient(client);
        var runnerConfigurer = new TaskRunnerConfigurer
                .Builder(taskClient, List.of(new HelloWorker()))
                .withThreadCount(10)
                .build();
        runnerConfigurer.init();
    }
}

These complete examples can be found here.

Note: If you want to run these code snippets in Orkes Conductor, remember to authenticate.

What’s next?: Roadmap

We aim for full parity between OSS server models and SDKs, so stay tuned for more changes to Conductor’s Java SDK and improved documentation. To stay up-to-date with our progress, check out the Conductor OSS Project Board. To request features or report bugs, create a ticket in our GitHub repository or contact us on Slack.

We’ll also soon tackle other supported languages: JavaScript, C#, Go, and Clojure. In the meantime, happy coding! Don’t forget to follow the Conductor OSS project and support us by giving a ⭐.


Orkes Cloud is a fully managed and hosted Conductor service that can scale seamlessly to meet your needs. When you use Conductor via Orkes Cloud, your engineers don’t need to worry about setting up, tuning, patching, and managing high-performance Conductor clusters. Try it out with our 14-day free trial for Orkes Cloud.

以上が新しい Conductor Java クライアント v4 の発表の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。