logologo
スタート
マニュアル
開発
プラグイン
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
スタート
マニュアル
開発
プラグイン
API
logologo
クラスターモード
概要
事前準備
Kubernetes デプロイ
運用フロー
サービス分割
開発リファレンス
Previous Page運用フロー
Next Page開発リファレンス
TIP

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

#サービスの分割 v1.9.0+

#はじめに

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

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

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

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

20250803214857

#分割可能なサービス

#非同期ワークフロー

サービス KEY:workflow:process

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

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

サービス KEY:async-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環境では、分割された機能が同じノードには、同じ環境変数を設定できます。これにより、特定の種類のサービスを簡単に水平スケーリングできます。

#設定例

#複数ノードでの個別処理

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

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

#複数ノードでの混合処理

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

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

#開発者向けリファレンス

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

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