logologo
开始
手册
开发
插件
API
English
简体中文
开始
手册
开发
插件
API
English
简体中文
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 {
  // 不处理该服务的业务逻辑
}