ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NocoBase 多环境混合部署模式(Supervisor + Worker):基于 Redis 的远程多应用架构实战

NocoBase 多环境混合部署模式(Supervisor + Worker):基于 Redis 的远程多应用架构实战 NocoBase 多环境混合部署模式Supervisor Worker基于 Redis 的远程多应用架构实战【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase本文围绕 NocoBase 的多应用multi-app能力展开重点讲解「多环境混合部署模式」remote 模式。在该模式下系统以入口应用Supervisor作为统一管理与调度中心以多个独立部署的工作应用Worker承载具体业务应用与环境的配置、指令与状态同步全部依赖 Redis 完成。读完本文你将掌握 Supervisor/Worker 两种角色的环境变量配置、基于 Docker Compose 的多环境编排、应用创建/启动/停止/代理访问的完整操作流程以及背后 AppSupervisor 适配器与心跳机制的源码级原理。多环境模式的定位与适用场景NocoBase 的多应用能力分为两种部署形态共享内存模式一个 NocoBase 实例的单个进程中同时运行多个应用应用之间共享进程与内存运维简单详见 共享内存模式。多环境混合部署模式remote 模式通过一个入口应用统一管理多个独立部署的 NocoBase 实例作为独立运行环境承载业务应用。共享内存模式在部署和运维上具有明显优势但随着应用数量和业务复杂度的提升单一实例可能逐渐面临资源争用、稳定性下降等问题。针对这类场景多环境混合部署方案应运而生各环境之间相互隔离、协同工作从而有效分散单实例压力显著提升系统的稳定性、可扩展性与故障隔离能力。在部署层面不同环境既可以运行在独立进程中也可以部署为不同的 Docker 容器或以多个 Kubernetes Deployment 的形式存在能够灵活适配不同规模和架构的基础设施环境。架构与核心概念在多环境混合部署模式下系统由两类角色构成角色职责入口应用Supervisor统一管理应用与环境信息负责应用创建、启动、停止及环境调度以及应用访问代理工作应用Worker作为实际的业务运行环境负责承载和运行具体的 NocoBase 应用实例两者之间的协作依赖两项基础设施Redis一方面缓存应用与环境配置另一方面作为入口应用与工作应用之间的命令通信通道指令下发与状态同步。数据库入口应用与工作应用需连接的数据库服务不同环境应使用相互隔离的数据库避免数据冲突。注意目前尚未提供环境创建功能各工作应用需要手工部署并配置好对应的环境信息后才能被入口应用识别。从源码看这套机制由AppSupervisor统一调度见 packages/core/server/src/app-supervisor/index.ts。它通过三个可插拔适配器Adapter完成核心职责发现适配器AppDiscoveryAdapter负责应用模型的发现、环境信息注册与心跳、应用状态维护以及proxyWeb/proxyWs代理转发。进程适配器AppProcessAdapter负责应用的实际创建、启动、停止、移除等进程生命周期管理。命令适配器AppCommandAdapter负责跨实例Supervisor ↔ Worker命令的分发与处理。三个适配器的名称分别由环境变量APP_DISCOVERY_ADAPTER、APP_PROCESS_ADAPTER、APP_COMMAND_ADAPTER解析AppSupervisor构造函数中通过resolveDiscoveryAdapterName()等三个方法读取环境变量默认回退到main-only适配器再调用对应的工厂方法实例化app-supervisor/index.ts。在 remote 模式下Supervisor 与 Worker 各自注册适配器的组合不同从而形成「入口集中管理 工作环境分散执行」的架构。部署前的架构依赖在部署前请准备好以下服务Redis缓存应用与环境配置作为入口应用与工作应用之间的命令通信通道数据库入口应用与工作应用需连接的数据库服务需要说明的是Supervisor 与 Worker 可以连接到同一套 Redis 服务使用不同的 db index 或同一 db但各工作应用的业务数据库应当相互隔离示例中每个 Worker 使用独立的DB_DATABASE这是环境隔离的基础。入口应用Supervisor环境变量配置入口应用作为统一管理中心负责应用创建、启动、停止及环境调度以及应用访问代理。其环境变量配置说明如下# 应用模式 APP_MODEsupervisor # 应用发现方式 APP_DISCOVERY_ADAPTERremote # 应用进程管理方式 APP_PROCESS_ADAPTERremote # 应用、环境配置缓存 redis APP_SUPERVISOR_REDIS_URL # 应用命令通信方式 APP_COMMAND_ADPATERredis # 应用命令通信 redis APP_COMMAND_REDIS_URL各变量含义与取值要点环境变量说明APP_MODEsupervisor声明当前实例为入口应用只有在该模式下才会加载应用模型并对外提供代理能力。源码中bootMainApp会检查process.env.APP_MODE supervisor才调用discoveryAdapter.loadAppModels?.(app)app-supervisor/index.tsproxyWeb/proxyWs也仅在该模式下生效app-supervisor/index.tsAPP_DISCOVERY_ADAPTERremote应用发现方式采用 remote即从 Redis 获取应用与环境配置APP_PROCESS_ADAPTERremote应用进程管理方式为 remote即应用的实际创建/启动/停止等指令通过 Redis 下发给对应的工作应用执行APP_SUPERVISOR_REDIS_URL应用与环境配置缓存的 Redis 连接串例如redis://redis:6379/0APP_COMMAND_ADPATERredis应用命令通信方式为 redisAPP_COMMAND_REDIS_URL应用命令通信使用的 Redis 连接串工作应用Worker环境变量配置工作应用作为实际的业务运行环境负责承载和运行具体的 NocoBase 应用实例。其环境变量配置说明如下# 应用模式 APP_MODEworker # 应用发现方式 APP_DISCOVERY_ADAPTERremote # 应用进程管理方式 APP_PROCESS_ADAPTERlocal # 应用、环境配置缓存 redis APP_SUPERVISOR_REDIS_URL # 应用命令通信方式 APP_COMMAND_ADPATERredis # 应用命令通信 redis APP_COMMAND_REDIS_URL # 环境标识 ENVIRONMENT_NAME # 环境访问 URL ENVIRONMENT_URL # 环境代理访问 URL ENVIRONMENT_PROXY_URL与 Supervisor 的关键差异APP_PROCESS_ADAPTERlocal工作应用在本地进程内管理应用实例应用直接跑在当前 Worker 进程中而 Supervisor 侧则通过 remote 适配器把命令分发出去。从源码结构看当APP_PROCESS_ADAPTER与APP_DISCOVERY_ADAPTER同名且发现适配器实现了addApp/startApp等方法时会直接复用发现适配器作为进程适配器app-supervisor/index.tslocal与remote的职责组合由此区分。ENVIRONMENT_NAME环境标识用于在 Supervisor 侧唯一标识该工作环境例如env_a。ENVIRONMENT_URL环境访问 URL即工作应用对外可访问的地址同时用于应用访问代理的默认目标地址。ENVIRONMENT_PROXY_URL环境代理访问 URL可选用于覆盖代理访问时使用的目标地址详见下文「应用访问代理」。在源码中环境信息通过getEnvironmentInfo()组装为{ name, url, proxyUrl, appVersion, lastHeartbeatAt }结构其中proxyUrl取ENVIRONMENT_PROXY_URL || ENVIRONMENT_URLapp-supervisor/index.ts与文档中的「覆盖」语义完全一致。对应的类型定义EnvironmentInfo位于 packages/core/server/src/app-supervisor/types.ts。Docker Compose 完整示例以下示例展示了一个以 Docker 容器为运行单元的多环境混合部署方案通过 Docker Compose 同时部署一个入口应用和两个工作应用worker_a、worker_b外加一个 Redis 服务。networks: nocobase: driver: bridge services: redis: networks: - nocobase image: redis/redis-stack-server:latest supervisor: container_name: nocobase-supervisor image: nocobase/nocobase:alpha restart: always platform: linux/amd64 networks: - nocobase depends_on: - redis environment: - DB_DIALECTpostgres - DB_HOSTpostgres - DB_PORT5432 - DB_DATABASEnocobase_supervisor - DB_USERpostgres - DB_PASSWORDpostgres - TZAsia/Shanghai - APP_MODEsupervisor - APP_DISCOVERY_ADAPTERremote - APP_PROCESS_ADAPTERremote - APP_SUPERVISOR_REDIS_URLredis://redis:6379/0 - APP_COMMAND_ADAPTERredis - APP_COMMAND_REDIS_URLredis://redis:6379/0 - APPEND_PRESET_BUILT_IN_PLUGINSnocobase/plugin-app-supervisor volumes: - ./storage-supervisor:/app/nocobase/storage ports: - 14000:80 worker_a: container_name: nocobase-worker-a image: nocobase/nocobase:alpha restart: always platform: linux/amd64 networks: - nocobase depends_on: - redis environment: - DB_DIALECTpostgres - DB_HOSTpostgres - DB_PORT5432 - DB_DATABASEnocobase_worker_a - DB_USERpostgres - DB_PASSWORDpostgres - TZAsia/Shanghai - APP_MODEworker - APP_DISCOVERY_ADAPTERremote - APP_PROCESS_ADAPTERlocal - APP_SUPERVISOR_REDIS_URLredis://redis:6379/0 - APP_COMMAND_ADAPTERredis - APP_COMMAND_REDIS_URLredis://redis:6379/0 - ENVIRONMENT_NAMEenv_a - ENVIRONMENT_URLhttp://localhost:15000 - ENVIRONMENT_PROXY_URLhttp://worker_a - APPEND_PRESET_BUILT_IN_PLUGINSnocobase/plugin-app-supervisor volumes: - ./storage-worker-a:/app/nocobase/storage ports: - 15000:80 worker_b: container_name: nocobase-worker-b image: nocobase/nocobase:alpha restart: always platform: linux/amd64 networks: - nocobase depends_on: - redis environment: - DB_DIALECTpostgres - DB_HOSTpostgres - DB_PORT5432 - DB_DATABASEnocobase_worker_b - DB_USERpostgres - DB_PASSWORDpostgres - TZAsia/Shanghai - APP_MODEworker - APP_DISCOVERY_ADAPTERremote - APP_PROCESS_ADAPTERlocal - APP_SUPERVISOR_REDIS_URLredis://redis:6379/0 - APP_COMMAND_ADAPTERredis - APP_COMMAND_REDIS_URLredis://redis:6379/0 - ENVIRONMENT_NAMEenv_b - ENVIRONMENT_URLhttp://localhost:16000 - ENVIRONMENT_PROXY_URLhttp://worker_b - APPEND_PRESET_BUILT_IN_PLUGINSnocobase/plugin-app-supervisor volumes: - ./storage-worker-b:/app/nocobase/storage ports: - 16000:80示例要点解读同一镜像不同角色Supervisor 与 Worker 使用同一nocobase/nocobase:alpha镜像通过APP_MODE与适配器变量的差异区分角色。数据库隔离Supervisor、worker_a、worker_b 分别使用nocobase_supervisor、nocobase_worker_a、nocobase_worker_b三个数据库生产环境中建议为各 Worker 准备独立的数据库实例或 Schema。Redis 共享三个节点共用redis://redis:6379/0Supervisor 通过它读取配置缓存、下发命令Worker 通过它上报心跳与同步状态。端口规划Supervisor 映射宿主机14000worker_a 映射15000worker_b 映射16000与ENVIRONMENT_URL保持一致。内置插件三者均通过APPEND_PRESET_BUILT_IN_PLUGINSnocobase/plugin-app-supervisor追加应用监管插件该插件在文档 frontmatter 中标记为pkg: nocobase/plugin-app-supervisor。数据持久化每个节点挂载独立的 storage 目录./storage-supervisor、./storage-worker-a、./storage-worker-b避免共享文件系统导致的数据串扰。说明示例中DB_HOSTpostgres指向一个 Postgres 服务若你的环境中数据库运行在 Compose 外部或使用其他方言请相应调整DB_DIALECT、DB_HOST、DB_PORT、DB_USER、DB_PASSWORD。容器内 80 端口为 NocoBase 默认 HTTP 端口。使用手册应用基础的管理操作如创建、启动、停止、删除应用等与共享内存模式无异请参考 共享内存模式。以下重点介绍与多环境配置相关的内容。环境列表部署完成后进入入口应用的「应用监管器」页面可以在「环境」标签页中查看已注册的工作环境列表。其中包括环境标识即ENVIRONMENT_NAME工作应用版本访问 URL状态是否在线可用工作应用每隔2 分钟上报一次心跳以确保环境的可用性。若超过心跳超时阈值仍未上报环境将被判定为不可用。这一行为在源码中有明确实现AppSupervisor中定义了environmentHeartbeatInterval 2 * 60 * 10002 分钟与environmentHeartbeatTimeout 5 * 60 * 10005 分钟两个常量app-supervisor/index.ts并通过heartbeatEnvironment()注册的setInterval定时向发现适配器上报心跳app-supervisor/index.ts。可用性判定逻辑位于normalizeEnvInfo()若Date.now() - lastHeartbeatAt environmentHeartbeatTimeout则available置为falseapp-supervisor/index.ts。对应的单元测试 environment-heartbeat.test.ts 验证了「5 分钟无心跳后环境被标记为离线」以及「心跳携带完整环境信息name/url/proxyUrl/appVersion/lastHeartbeatAt」这两个行为。应用创建在创建应用时可以选择一个到多个运行环境用于指定该应用将被部署到哪些工作应用中。通常情况下建议选择一个环境即可。仅在工作应用进行了服务拆分需要将同一应用部署到多个运行环境以实现负载分担或能力隔离的时候才选择多个环境。应用列表应用列表页面会显示每个应用当前所在的运行环境及状态信息如果应用部署在多个环境中则会显示多个运行状态。多个环境中的同一应用在正常情况下会保持统一状态需要统一控制启动和停止。应用启动由于应用启动时可能会向数据库写入初始化数据为了避免多环境下的竞态条件race condition部署在多个环境中的应用在启动时会排队进行即同一应用在多个环境中串行启动防止并发初始化造成数据不一致。应用访问代理工作应用可以通过入口应用的子路径/apps/:appName/admin进行代理访问即用户只需访问入口应用的地址即可进入部署在某个工作环境中的子应用后台。默认代理目标代理访问地址默认使用工作应用的访问地址对应环境变量为ENVIRONMENT_URL。需确保该地址在入口应用所在的网络环境中可访问例如 Docker 网络内应使用容器服务名而不是localhost。覆盖代理目标如需使用不同的代理访问地址可通过环境变量ENVIRONMENT_PROXY_URL进行覆盖。例如 Compose 示例中 worker_a 的ENVIRONMENT_URLhttp://localhost:15000用于环境信息展示与心跳上报而ENVIRONMENT_PROXY_URLhttp://worker_a则是 Docker 网络内 Supervisor 实际可访问的代理目标。多环境应用如果应用部署在多个环境中需要指定一个代理访问的目标环境入口应用将把请求转发到该环境对应的 Worker。代理链路在源码中由Gateway与发现适配器协作完成Gateway.proxyRequestToSubApp()调用supervisor.proxyWeb(appName, req, res)尝试代理转发在APP_MODEsupervisor且代理失败时会根据应用模型是否存在返回APP_ENVIRONMENT_UNAVAILABLE503环境存在但不可用或APP_NOT_FOUND404应用不存在错误packages/core/server/src/gateway/index.ts。对应的测试 remote-environment.test.ts 验证了当目标环境不可用且存在应用模型时返回 503 与APP_ENVIRONMENT_UNAVAILABLE应用模型不存在时返回 404 与APP_NOT_FOUND代理成功后不再查询模型或写入回退响应。同时proxyWeb/proxyWs仅在APP_MODEsupervisor时生效从代码层面保证了只有入口应用承担代理职责。多环境模式的运维注意事项环境手工注册目前系统未提供环境创建功能每个 Worker 必须手工部署并正确配置ENVIRONMENT_NAME等环境变量后才会出现在入口应用的环境列表中。心跳与可用性Worker 每 2 分钟上报一次心跳Supervisor 据此判断环境在线状态若 Worker 长期离线超过 5 分钟超时阈值入口应用将拒绝向该环境调度新请求返回 503。数据库隔离建议为每个 Worker 环境配置独立的数据库/Schema从数据层保证环境间的强隔离若需跨环境共享数据可借助外部数据源机制。代理地址可达性ENVIRONMENT_URL必须是入口应用网络环境内可达的地址跨容器/跨主机部署时推荐使用ENVIRONMENT_PROXY_URL显式指定内网可达地址而ENVIRONMENT_URL保留为对外展示地址。统一状态管理同一应用部署在多个环境时其启停操作是统一、排队的运维侧应通过入口应用的应用监管器统一管理避免在单个 Worker 上直接操作造成状态不一致。镜像与版本一致性示例中三个节点使用相同镜像保证应用版本一致升级时应同步升级所有 Supervisor 与 Worker 节点。小结多环境混合部署模式remote 模式是 NocoBase 多应用体系面向多实例、多环境场景的解决方案以 Supervisor 统一管理与代理、以 Redis 打通配置缓存与命令通道、以多个 Worker 承载隔离的业务环境。通过APP_MODE、APP_DISCOVERY_ADAPTER、APP_PROCESS_ADAPTER、APP_COMMAND_ADAPTER及ENVIRONMENT_*系列环境变量即可完成角色与网络配置配合 Docker Compose 可快速落地一入口多环境的部署拓扑。若你的业务规模尚未达到需要多实例的程度可优先采用共享内存模式local 模式以降低运维复杂度而当单实例面临资源与稳定性瓶颈时多环境混合部署模式则是更优的演进方向。【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表