Novu微服务架构详解:API服务、Worker与Webhook设计
Novu作为开源通知基础设施,采用微服务架构实现高可用性和可扩展性。其核心服务包括API服务、Worker服务和Webhook服务,分别处理不同业务场景。以下从架构设计、模块划分和代码实现三个维度解析其微服务架构。
整体架构概览
Novu微服务架构基于NestJS框架构建,采用模块化设计理念。核心服务通过消息队列实现解耦,支持水平扩展。系统整体架构如图所示:
核心服务功能划分
- API服务:处理客户端请求,提供RESTful接口和WebSocket连接
- Worker服务:异步处理通知发送、模板渲染和状态更新
- Webhook服务:接收外部系统事件,触发通知工作流
API服务设计
API服务是Novu系统的入口点,采用NestJS模块化架构,通过app.module.ts组织核心业务模块。
模块结构
API服务的核心模块定义在src/app.module.ts中,包含以下关键模块:
// 核心业务模块示例
const baseModules = [
AuthModule, // 认证授权
InboundParseModule, // 入站邮件解析
WorkflowModuleV1, // 工作流管理V1
EventsModule, // 事件处理
NotificationModule, // 通知管理
SubscribersModule, // 订阅者管理
IntegrationModule // 第三方集成
];
关键功能实现
1. 认证与授权
采用JWT认证机制,通过AuthModule实现权限控制:
- 路径:src/app/auth
- 核心功能:用户登录、API密钥管理、权限验证
2. 通知工作流
支持多版本工作流管理,V2版本提供更灵活的流程定义:
- 路径:src/app/workflows-v2
- 核心功能:工作流CRUD、条件分支、模板引用
3. 实时通知
通过WebSocket提供实时通知推送:
- 路径:src/app/inbox
- 实现文件:inbox.gateway.ts
Worker服务设计
Worker服务负责处理异步任务,采用NestJS的任务队列机制,通过消息队列实现负载均衡。
架构特点
Worker服务的入口模块定义在src/app.module.ts,核心模块包括:
const modules = [
SharedModule, // 共享工具
HealthModule, // 健康检查
WorkflowModule, // 工作流处理
TelemetryModule // 性能监控
];
关键任务处理流程
Worker服务通过WorkflowModule处理通知发送流程:
- 任务接收:从消息队列获取通知任务
- 模板渲染:解析并渲染通知模板
- 渠道适配:根据通知类型选择合适的发送渠道
- 状态更新:跟踪通知发送状态并更新数据库
核心代码实现位于src/app/workflow目录,包含以下关键用例:
- send-notification.usecase.ts:处理单条通知发送
- process-each-step.usecase.ts:处理工作流步骤
Webhook服务设计
Webhook服务负责接收外部系统事件,触发通知工作流。采用NestJS控制器接收HTTP请求,通过策略模式处理不同类型的事件。
模块结构
Webhook服务的核心模块定义在src/webhooks/webhooks.module.ts,包含:
@Module({
imports: [SharedModule],
controllers: [WebhooksController],
providers: [
WebhooksService,
GithubWebhookHandler, // GitHub事件处理器
GitlabWebhookHandler, // GitLab事件处理器
// 其他事件处理器...
]
})
export class WebhooksModule {}
事件处理流程
- 请求验证:验证Webhook签名,确保请求合法性
- 事件路由:根据事件类型分发到对应处理器
- 工作流触发:调用API服务触发通知工作流
核心代码实现位于src/webhooks/usecases目录,包含:
- handle-github-webhook.usecase.ts
- handle-gitlab-webhook.usecase.ts
服务间通信
Novu微服务之间通过以下方式实现通信:
1. 消息队列
采用BullMQ作为任务队列,实现API服务与Worker服务解耦:
- 队列配置:src/config/queue.config.ts
- 生产者代码:src/app/events/usecases/trigger-event.usecase.ts
- 消费者代码:src/app/workflow/queue/workflow.consumer.ts
2. 内部API调用
服务间通过HTTP客户端进行同步通信:
- API客户端:src/app/bridge/services/bridge.service.ts
部署与扩展
Novu微服务可通过Docker容器化部署,每个服务独立扩展。项目提供完整的Docker配置:
- API服务:Dockerfile
- Worker服务:Dockerfile
- Webhook服务:Dockerfile
- Docker Compose配置:docker/local/docker-compose.yml
扩展策略
- 水平扩展:通过增加服务实例数量提高吞吐量
- 垂直分区:按业务领域拆分Worker服务,处理特定类型任务
- 缓存优化:使用Redis缓存频繁访问数据,如模板和订阅者信息
总结
Novu的微服务架构通过合理的职责划分和通信机制,实现了高可用性和可扩展性。API服务作为系统入口处理客户端请求,Worker服务异步处理通知发送,Webhook服务连接外部系统,三者协同工作形成完整的通知基础设施。
通过模块化设计和依赖注入,Novu代码库保持了良好的可维护性和可扩展性。开发者可通过扩展模块或集成新的通知渠道,快速定制符合业务需求的通知系统。
完整的架构设计文档可参考:
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



