Tip

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

サービスの分割 v1.9.0+

NocoBase クラスターEnterprise Edition+

はじめに

通常、NocoBaseアプリケーションのすべてのサービスは、単一のNode.jsインスタンスで動作します。ビジネスの成長とともにアプリケーション内の機能が複雑になるにつれて、一部の時間のかかるサービスが全体のパフォーマンスに影響を与える可能性があります。

アプリケーションのパフォーマンスを向上させるため、NocoBaseはクラスターモードでのアプリケーションサービスの異なるノードへの分割実行をサポートしています。これにより、単一サービスのパフォーマンス問題がアプリケーション全体に影響を与え、ユーザーリクエストに正常に応答できなくなるのを防ぎます。

また、特定のサービスを対象に水平スケーリングを行い、クラスターのリソース利用率を向上させることも可能です。

NocoBaseをクラスターにデプロイする際、異なるサービスを分割して別々のノードで実行できます。以下の図は、分割構造の概要を示しています。

20250803214857

分割可能なサービス

非同期ワークフロー

サービス KEYworkflow:process

非同期モードのワークフローは、トリガーされるとキューに入り、順次実行されます。これらのワークフローはバックグラウンドタスクと見なすことができ、通常、ユーザーが結果の返却を待つ必要はありません。特に、複雑で時間のかかるプロセスやトリガーされる頻度が高い場合は、独立したノードに分割して実行することをお勧めします。

その他のユーザーレベルの非同期タスク

サービス KEYasync-task:process

非同期のインポートやエクスポートなど、ユーザー操作によって作成されるタスクが含まれます。大量のデータや高い並行処理が発生する場合、独立したノードに分割して実行することをお勧めします。

サービスを分割する方法

異なるサービスを別々のノードに分割するには、環境変数 WORKER_MODE を設定する必要があります。この環境変数は、以下のルールに従って設定できます。

  • WORKER_MODE=<空>:未設定の場合、または空に設定されている場合、ワーカーモードは現在の単一インスタンスモードと同じになり、すべてのリクエストを受け入れ、すべてのタスクを処理します。これは、以前に設定されていなかったアプリケーションとの互換性があります。
  • WORKER_MODE=!:ワーカーモードはリクエストのみを処理し、タスクは一切処理しません。
  • WORKER_MODE=workflow:process,async-task:process:1つまたは複数のサービス識別子(カンマ区切り)で設定された場合、ワーカーモードはこれらの識別子に該当するタスクのみを処理し、リクエストは処理しません。
  • WORKER_MODE=*:ワーカーモードはモジュールに関係なくすべてのバックグラウンドタスクを処理しますが、リクエストは処理しません。
  • WORKER_MODE=!,workflow:process:ワーカーモードはリクエストを処理し、同時に特定の識別子に該当するタスクのみを処理します。
  • WORKER_MODE=-:ワーカーモードはリクエストもタスクも一切処理しません(このモードはワーカープロセス内で必要です)。

例えば、K8S環境では、分割された機能が同じノードには、同じ環境変数を設定できます。これにより、特定の種類のサービスを簡単に水平スケーリングできます。

設定例

複数ノードでの個別処理

node1node2node3の3つのノードがあると仮定します。これらは次のように設定できます。

  • node1:ユーザーUIリクエストのみを処理します。WORKER_MODE=! を設定します。
  • node2:ワークフロータスクのみを処理します。WORKER_MODE=workflow:process を設定します。
  • node3:非同期タスクのみを処理します。WORKER_MODE=async-task:process を設定します。

複数ノードでの混合処理

node1node2node3node4の4つのノードがあると仮定します。これらは次のように設定できます。

  • node1node2:すべての通常リクエストを処理します。WORKER_MODE=! を設定し、ロードバランサーがこれらの2つのノードにリクエストを自動的に分散します。
  • node3node4:その他のすべてのバックグラウンドタスクを処理します。WORKER_MODE=* を設定します。

開発者向けリファレンス

ビジネスプラグインを開発する際、要件に応じて、リソース消費の大きいサービスを分割することができます。これは以下の方法で実現できます。

  1. 環境変数設定のために、例えば my-plugin:process のような新しいサービス識別子を定義し、そのドキュメントを提供します。
  2. プラグインのサーバーサイドのビジネスロジックで、serving() のインターフェースを使用して環境を判断し、現在のノードが環境変数に基づいて特定のサービスを提供すべきかを決定します。
import { serving } from '@nocobase/server';

const MY_PLUGIN_SERVICE_KEY = 'my-plugin:process';
// プラグインのサーバーサイドコード内
if (serving(MY_PLUGIN_SERVICE_KEY)) {
  // このサービスのビジネスロジックを処理
} else {
  // このサービスのビジネスロジックは処理しない
}