Skip to content

基础认识

本文档旨在介绍在专业算力环境中部署和运行应用程序的最佳实践,重点关注无状态设计、API 交互以及通过一个 ComfyUI 示例来阐述核心概念,以确保服务的可扩展性、可靠性和可维护性。

1. 理解多节点负载均衡

1.1 核心概念

多节点负载均衡是指将传入的网络流量或计算任务智能地分配到多个服务器(节点)上。在专业算力环境中,这意味着用户的请求或计算作业不会只由一台机器处理,而是由一个服务器集群共同承担。

核心价值

  • 增强可用性和可靠性:如果某个节点发生故障,负载均衡器会自动将流量重新导向到健康的节点,保证服务的持续运行。

  • 提升可扩展性:当业务量增长时,可以轻松地向集群中添加更多节点来处理增加的负载,实现弹性伸缩。

无状态设计的重要性

为了充分利用负载均衡的优势,确保请求可以在不同节点间自由切换而不丢失状态,服务通常需要设计成无状态 (Stateless)。这使得任何一个服务实例都可以处理任何请求,而无需依赖先前交互存储的本地信息。这种设计是实现高可用性和可扩展性的关键。

1.2 技术挑战

在多节点负载均衡环境中,可能会遇到以下技术挑战:

状态管理挑战

  • 会话状态管理:传统的基于本地会话的应用在多节点环境下可能出现状态不一致,需要采用分布式会话管理方案

数据一致性挑战

  • 数据一致性:多个节点同时处理请求时,需要确保数据的一致性,避免数据冲突或版本不一致

  • 缓存同步:各节点的本地缓存需要及时同步,否则可能导致数据不一致

2. 容器化最佳实践

2.1 无状态设计原则

在专业算力环境中,将应用包装成无状态的 Docker 镜像是最佳实践的核心。无状态设计确保容器可以在任何时间被创建、销毁或迁移,而不会影响服务的连续性。特别是在多节点负载均衡部署中,无状态设计至关重要,因为有状态服务可能导致用户的请求被路由到不同的节点,从而引发状态信息不一致或丢失,影响服务的可靠性和数据准确性。

设计要点

  • 数据与应用分离:所有持久化数据应存储在外部存储服务中,而非容器内部

  • 配置外部化:通过环境变量或配置文件挂载实现配置的动态注入

  • 会话无关性:不依赖本地会话状态,所有状态信息通过外部缓存或数据库管理

2.2 容器运行时优化

运维保障

  • 健康检查:实现完善的健康检查机制,支持自动恢复

  • 优雅终止:正确处理 SIGTERM 信号,确保服务优雅关闭

  • 日志标准化:将日志输出到标准输出(stdout/stderr),便于统一采集

3. 使用 API 交互模式,而不是 WebUI

3.1 优势分析

可扩展性优势

  • 弹性伸缩:无状态服务不保存用户数据和会话信息,每个请求都是独立的,使系统能够根据负载自动扩展或缩减资源

  • 负载均衡:请求可以被分发到任意可用的服务实例,实现更高效的负载分配

可靠性优势

  • 故障隔离:单个服务实例故障不会影响整体系统运行

  • 自动恢复:结合专业算力的故障自动转移机制,确保业务连续性

3.2 实现建议

WebUI 交互的局限性

虽然 WebUI 提供了直观的用户界面,但在专业算力环境中直接部署 WebUI 进行交互存在以下问题:

  • 扩展性受限:难以实现自动化扩展,无法充分利用专业算力的弹性能力

  • 负载均衡困难:使用 WebSocket(例如 ComfyUI 常用的方式)进行长连接交互时,标准的负载均衡器可能难以维持连接状态。请求可能被分发到不同的后端实例,导致后续消息路由错误、状态丢失或处理不一致。

因此,我们建议将 WebUI 仅用于开发测试阶段,在生产环境中采用 API 形式与服务交互,并在前端应用中构建统一的用户界面。

4. 实践案例:ComfyUI

4.1 系统架构

其中最关键的部分是 API 网关服务,它负责处理用户请求并将请求转发给 ComfyUI 引擎。

4.2 功能特性

核心功能

此网关可能提供以下核心功能,以适配多节点均衡负载:

  • 无状态 API 设计:服务完全无状态,可水平扩展以处理更多请求

  • 同步响应模式:当未提供 webhook 时,直接在响应中返回 base64 编码的图像

  • Webhook 支持:可将生成的图像发送到指定的 webhook,用于存储图像或将其发送给用户

  • Websocket 事件转发:可将 ComfyUI websocket 事件转发到配置的 webhook,用于监控工作流进度

额外功能

  • 灵活的图像提交方式:接受 base64 编码字符串或图像 URL,简化图像到图像工作流的使用

  • 预热工作流:可配置在启动时运行预热工作流,用于加载和预热模型,确保服务准备就绪

  • 健康检查探针:提供 /health 和 /ready 两个探针,用于检查服务的健康状态和就绪状态

  • 动态工作流端点:通过在 Docker 镜像的 /workflows 目录中添加符合规范的 .js 或 .ts 文件,自动挂载新的工作流端点

  • 自定义模型和扩展支持:支持添加任何模型或扩展到标准 ComfyUI 目录 /opt/ComfyUI/