---
pkg: "@nocobase/preset-cluster"
title: "サービス分割"
description: "ワークフローや非同期タスクなどの処理を専用ノードに分割。WORKER_MODE によるリクエストノードとタスクノード、水平スケール。"
keywords: "サービス分割,WORKER_MODE,非同期ワークフロー,async-task,水平スケール,リクエストノード,タスクノード,NocoBase"
---

# サービスの分割 <Badge>v1.9.0+</Badge>

## はじめに

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

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

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

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

![20250803214857](https://static-docs.nocobase.com/20250803214857.png)

## 分割可能なサービス

### 非同期ワークフロー

**サービス 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. プラグインのサーバーサイドのビジネスロジックで、`serving()` のインターフェースを使用して環境を判断し、現在のノードが環境変数に基づいて特定のサービスを提供すべきかを決定します。

```javascript
import { serving } from '@nocobase/server';

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