一、核心功能设计
1. 发货事件触发机制
- 订单状态变更监听(如从"待发货"→"已发货")
- 物流单号生成事件
- 定时任务扫描超时订单(可选)
2. 通知渠道集成
- 短信:阿里云/腾讯云短信API
- 微信:公众号模板消息/小程序服务通知
- 邮件:SMTP协议集成
- 企业微信/钉钉:机器人Webhook
二、技术实现方案(基于万象框架)
方案1:事件驱动架构(推荐)
```python
示例:基于Spring Cloud Stream的事件监听(伪代码)
@StreamListener("orderEventChannel")
public void handleShippingEvent(ShippingEvent event) {
// 1. 查询收货人信息
Customer customer = customerService.getById(event.getCustomerId());
// 2. 构建多通道通知
List notifications = Arrays.asList(
new SmsNotification(customer.getPhone(), buildSmsContent(event)),
new WechatNotification(customer.getOpenId(), buildWechatTemplate(event))
);
// 3. 异步发送(避免阻塞主流程)
notificationService.sendAsync(notifications);
// 4. 记录发送日志
logNotification(event.getOrderId(), notifications);
}
```
方案2:定时任务扫描(备用方案)
```java
// Spring Scheduler示例
@Scheduled(fixedRate = 300000) // 每5分钟扫描一次
public void checkPendingShipments() {
List pendingOrders = orderRepository.findByStatusAndNotified("SHIPPED", false);
pendingOrders.forEach(order -> {
sendNotification(order);
order.setNotified(true);
orderRepository.save(order);
});
}
```
三、关键优化点
1. 防重复通知机制
- 数据库字段`is_notified`标记
- Redis分布式锁控制并发
- 消息队列去重(如RabbitMQ的唯一ID)
2. 通知模板管理
```yaml
配置文件示例
notification:
templates:
sms:
shipping: "【水果批发】您的订单%{order_no}已发货,物流单号%{tracking_no},预计%{arrival_time}送达"
wechat:
template_id: "ABC123"
data:
orderNo: "{order_no}"
trackingUrl: "http://logistics.com/{tracking_no}"
```
3. 失败重试策略
- 指数退避算法(1min, 5min, 30min)
- 死信队列处理永久失败通知
- 人工干预入口(管理后台)
四、部署实施步骤
1. 环境准备
- 基础环境:Java 11+ / Node.js 14+
- 消息队列:RabbitMQ/Kafka(可选)
- 缓存:Redis(用于限流和去重)
2. 源码部署流程
```bash
示例部署命令
git clone https://github.com/your-repo/fruit-notification.git
cd fruit-notification
mvn clean package
java -jar target/notification-service.jar \
--spring.datasource.url=jdbc:mysql://db:3306/fruit_db \
--notification.sms.api-key=your_api_key
```
3. 监控告警配置
- Prometheus + Grafana监控通知成功率
- 失败通知阈值告警(如连续5次失败)
- 通知渠道健康检查(如短信接口响应时间)
五、扩展功能建议
1. 客户偏好设置
- 允许客户选择通知渠道(如只接收微信不接收短信)
- 静默时段设置(如22:00-8:00不发送短信)
2. 物流追踪集成
- 接入快递100/菜鸟裹裹API
- 自动推送物流节点更新
3. 多语言支持
- 国际化模板管理
- 根据客户地区自动切换语言
六、常见问题处理
1. 通知延迟
- 检查消息队列积压情况
- 优化异步任务线程池配置
2. 模板渲染错误
- 添加模板语法校验
- 关键字段缺失时走默认模板
3. 渠道限流
- 短信平台接口限流时自动切换备用渠道
- 实现令牌桶算法控制发送频率
建议采用微服务架构将通知服务独立部署,通过REST/gRPC与主系统交互。对于中小型批发商,也可考虑使用Serverless架构(如阿里云函数计算)降低运维成本。实际部署时需根据业务规模选择合适的技术栈。