一、核心功能需求拆解
1. 发货事件触发
- 订单状态变更(待发货→已发货)
- 物流单号生成
- 仓库出库确认
2. 通知渠道覆盖
- 内部系统:ERP/WMS弹窗提醒
- 外部通知:短信/邮件/企业微信/钉钉
- 移动端:APP推送/小程序模板消息
3. 数据同步要求
- 实时性:<5秒延迟
- 准确性:100%送达率
- 可追溯:通知日志记录
二、万象源码部署架构
1. 基础环境配置
```yaml
示例Docker Compose配置
version: 3.8
services:
notification-service:
image: wanxiang/notification:latest
environment:
- REDIS_HOST=redis
- RABBITMQ_HOST=rabbitmq
- SMS_API_KEY=your_key
depends_on:
- redis
- rabbitmq
```
2. 关键组件说明
| 组件 | 功能 | 技术选型建议 |
|---------------|-----------------------------|--------------------------|
| 事件总线 | 订单状态变更监听 | RabbitMQ/Kafka |
| 规则引擎 | 通知条件判断(如VIP客户加急) | Drools/Easy Rules |
| 模板引擎 | 多渠道消息内容生成 | Thymeleaf/Freemarker |
| 限流组件 | 防止短信轰炸 | Guava RateLimiter |
| 补偿机制 | 失败通知重试 | 死信队列+定时任务 |
三、核心代码实现(Java示例)
1. 事件监听器
```java
@Component
public class OrderShipmentListener {
@RabbitListener(queues = "order.shipment.queue")
public void handleShipment(OrderShipmentEvent event) {
// 1. 参数校验
if (event.getOrderId() == null) {
log.error("Invalid shipment event: {}", event);
return;
}
// 2. 构建通知上下文
NotificationContext context = NotificationContext.builder()
.orderId(event.getOrderId())
.customerId(event.getCustomerId())
.logisticsNo(event.getLogisticsNo())
.build();
// 3. 触发通知流程
notificationService.send(context);
}
}
```
2. 通知服务实现
```java
@Service
public class NotificationService {
@Autowired
private TemplateEngine templateEngine;
@Autowired
private SmsClient smsClient;
public void send(NotificationContext context) {
// 1. 多渠道通知组合
List channels = determineChannels(context);
// 2. 异步发送(避免阻塞主流程)
channels.forEach(channel -> {
CompletableFuture.runAsync(() -> {
String content = generateContent(channel.getType(), context);
channel.send(content);
});
});
// 3. 记录通知日志
saveNotificationLog(context);
}
private String generateContent(ChannelType type, NotificationContext context) {
Map vars = new HashMap<>();
vars.put("orderNo", context.getOrderId());
vars.put("logisticsNo", context.getLogisticsNo());
vars.put("shipTime", LocalDateTime.now());
return templateEngine.process(
"notification/" + type.name().toLowerCase(),
vars
);
}
}
```
四、部署优化建议
1. 高可用设计
- 消息队列集群部署
- 通知服务无状态化+负载均衡
- 数据库分库分表(按客户ID哈希)
2. 性能优化
- 短信接口异步调用
- 模板渲染缓存(Caffeine)
- 批量通知合并(同一客户多订单)
3. 监控告警
- Prometheus指标采集:
```
notification_send_success_total{channel="sms"} 1024
notification_send_failure_total{channel="wechat"} 3
```
- 告警规则:
- 5分钟内短信失败率>5%
- 通知延迟>30秒
五、典型部署流程
1. 环境准备
```bash
基础组件部署
docker network create wanxiang-net
docker run -d --name redis --network wanxiang-net redis:6-alpine
docker run -d --name rabbitmq --network wanxiang-net rabbitmq:3-management
```
2. 应用部署
```bash
构建镜像
mvn clean package
docker build -t wanxiang/notification .
启动服务
docker-compose up -d
```
3. 验证测试
```java
// 测试代码示例
@SpringBootTest
public class NotificationTest {
@Autowired
private NotificationService service;
@Test
public void testSend() {
NotificationContext ctx = new NotificationContext();
ctx.setOrderId("TEST123");
ctx.setCustomerId("CUST001");
service.send(ctx);
// 验证短信/邮件是否收到
}
}
```
六、扩展功能建议
1. 智能通知策略
- 根据客户等级动态调整通知频率
- 工作日/节假日差异化通知时间
2. 互动式通知
- 短信中嵌入物流查询链接
- 微信模板消息支持点击跳转
3. 数据分析看板
- 通知送达率趋势图
- 渠道效果对比分析
建议在实际部署前进行压力测试,模拟高峰期(如节假日前)的订单量,验证系统承载能力。对于日均10万+订单量的系统,建议采用分库分表+读写分离的数据库架构。