随着健康与营养业务的不断扩张,单一的后端系统已无法满足需求。AI聊天机器人流量、大量的可穿戴设备数据摄取以及日常的API请求都在争夺相同的资源——这使得系统难以扩展且部署风险高。我们将其重新架构为专注于特定功能、可独立部署的服务,并通过单一API网关在AWS上进行编排。
面临的挑战
- 一个代码库处理所有任务。一个工作流包括用户管理、AI chatbot推理、食谱和健康数据分析。任何一个领域的激增都会降低整个平台的性能,并且每次更改都意味着需要重新部署整个系统。
- 极度异构的资源配置文件。LLM驱动的聊天机器人请求对CPU和内存要求高且具有突发性;可穿戴设备数据摄取是写入密集型的且连续;核心CRUD APIs则轻量且稳定。为这三者配置一个服务器意味着某些工作负载会过度付费,而另一些则资源不足。
- 独立的扩展和部署。团队需要在不影响核心API的情况下扩展AI工作负载,并且在发布某个领域的更改时不会危及其他领域。
单一、安全的入口点。尽管有多个后端服务,客户端(移动、网络、管理)需要一个统一、经过身份验证的接口进行通信——不会将内部服务拓扑暴露给外部。
我们的解决方案
我们将平台拆分为三个专注于特定功能的NestJS服务,它们位于AWS Application Load Balancer之后,主服务器充当API gateway和编排器。它负责身份验证和核心领域,并通过经过身份验证的REST将专业工作委托给聊天机器人和健康微服务。共享数据和消息层使服务保持松散耦合但一致。

架构
- 主服务器 (NestJS) — API gateway和编排器:负责身份验证、用户、目标、食谱、日程安排和通知。所有客户端都有一个单一的公共入口点。
- 聊天机器人微服务 (NestJS) — 由Azure OpenAI (GPT-4o)通过LangChain/LangGraph提供支持的AI对话服务,并使用Elasticsearch支持的RAG进行食谱和知识检索。
- 健康微服务 (NestJS) — 摄取并聚合可穿戴设备和手动健康数据 (Apple Health, Health Connect),并提供分析服务。
- AWS ECS Fargate运行这三个容器化服务,每个服务都有自己的CPU/内存配置和扩展策略。
- Application Load Balancer终止HTTPS连接并将流量路径路由到正确的服务。
- 共享数据层 — MongoDB Atlas (主存储), Redis (缓存/会话), Elasticsearch (搜索), ActiveMQ (异步通知交付)。
CI/CD — Docker多阶段构建推送到Amazon ECR,作为滚动更新部署到ECS。
主要特点
1. 编排器模式。主服务器是唯一暴露给客户端的服务。它对每个请求进行身份验证,然后进行内部服务到服务调用——这样后端拓扑保持私有,客户端集成保持简单。
2. 经过身份验证的服务间调用。服务间通信是通过共享HTTP客户端实现的REST,使用每个服务的bearer API密钥进行保护:
// 主服务器将AI请求委托给聊天机器人微服务 const reply = await this.microserviceClient.post( this.chatbotApiKey, // 每个服务的bearer密钥 `${this.chatbotUrl}/chat`, { user, question, sessionId, attachment }, ); |
3. 按工作负载独立扩展。每个服务都是一个独立的Fargate任务定义,拥有自己的规模配置——内存密集型聊天机器人服务可以独立于轻量级核心API进行扩展,因此AI流量高峰永远不会导致日常请求饥饿。
4. 规模适当且内置弹性的AI服务。聊天机器人服务在多个Azure OpenAI密钥之间轮换,在达到速率限制或发生错误时自动故障转移——确保AI功能在高负载下保持响应。
5. 通过异步消息传递实现通知。由于ActiveMQ延迟队列将基于时间的提醒和通知与请求流分离,通知传递永远不会阻碍或减慢核心API流量。
6. 可重复、隔离的部署。从ECR到ECS,每个服务都作为独立的Docker镜像发布。对健康服务的修改仅重新部署健康服务——通过带有健康检查的滚动更新,实现快速、低风险的发布。
7. 一个一致的客户端契约。移动端 (React Native) 和管理仪表盘都与单一的负载均衡、HTTPS入口点通信——内部拆分为微服务对它们是不可见的。
结果
- 如今,AI chatbots、健康数据和核心APIs的工作负载可以独立扩展;没有一个任务会影响其他任务的性能。
- 每个服务都独立部署,将高风险的全平台发布转变为快速、隔离的更新。
- 每个服务的计算资源都经过适当调整,避免了“一刀切”服务器的资源过度配置问题。
- 一个单一、安全、负载均衡的入口点使客户端集成保持简单,同时后端保持私有和模块化。
技术栈
NestJS · TypeScript · Node.js 20 · Azure OpenAI (GPT-4o) · LangChain · MongoDB Atlas · Redis · Elasticsearch · ActiveMQ · AWS ECS Fargate · Application Load Balancer · Amazon ECR · Docker
其他博客

