logologo
开始
手册
开发
插件
API
首页
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
开始
手册
开发
插件
API
首页
logologo
集群模式
概述
准备工作
Kubernetes 部署
运维流程
服务拆分
开发参考
Previous Page运维流程
Next Page开发参考

#服务拆分 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:配置为一个或多个服务标识(以英文逗号分隔),工作模式为仅处理该标识的任务,不处理请求。
  • WORKER_MODE=*:工作模式为处理所有后台任务,不分模块,但不处理请求。
  • WORKER_MODE=!,workflow:process:工作模式为处理请求,同时只处理某个标识的任务。
  • WORKER_MODE=-:工作模式为不处理任何请求和任务(在 worker 进程内需要该模式)。

例如在 K8S 环境中,可以将拆分功能相同的节点都使用相同的环境变量配置,可以方便的针对某类服务进行水平扩展。

#配置示例

#多节点分别处理

假设有三个节点,分别为 node1、node2 和 node3,可以按以下方式配置:

  • node1:仅处理用户 UI 请求,配置 WORKER_MODE=!。
  • node2:仅处理工作流任务,配置 WORKER_MODE=workflow:process。
  • node3:仅处理异步任务,配置 WORKER_MODE=async-task:process。

#多节点混合处理

假设有四个节点,分别为 node1、node2、node3 和 node4,可以按以下方式配置:

  • node1 和 node2:处理所有常规请求,配置 WORKER_MODE=!,并由负载均衡自动将请求分发到这两个节点。
  • 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 {
  // 不处理该服务的业务逻辑
}