一、系统架构设计
1. 核心模块
- 订单管理模块:实时监控订单状态变更(待发货→已发货)
- 通知引擎模块:支持多渠道消息推送(短信/邮件/APP/微信)
- 模板管理模块:可配置化通知内容模板
- 日志审计模块:记录通知发送状态与结果
2. 技术栈建议
```markdown
- 后端框架:Spring Boot 2.7+(快速开发)
- 消息队列:RabbitMQ/Kafka(异步通知解耦)
- 定时任务:Quartz/XXL-JOB(补发机制)
- 数据库:MySQL 8.0(订单状态表优化)
- 缓存:Redis(防重复通知)
```
二、关键代码实现(Spring Boot示例)
1. 订单状态监听器
```java
@Component
@RabbitListener(queues = "order.status.change")
public class OrderStatusListener {
@Autowired
private NotificationService notificationService;
public void handleOrderStatusChange(OrderStatusEvent event) {
if ("SHIPPED".equals(event.getNewStatus())) {
// 触发发货通知
notificationService.sendShippingNotice(event.getOrderId());
}
}
}
```
2. 通知服务实现
```java
@Service
public class NotificationServiceImpl implements NotificationService {
@Autowired
private OrderRepository orderRepository;
@Autowired
private SmsClient smsClient;
@Override
public void sendShippingNotice(Long orderId) {
Order order = orderRepository.findById(orderId)
.orElseThrow(() -> new RuntimeException("订单不存在"));
// 构建通知内容(支持模板引擎)
String content = String.format(
"【水果批发】订单%s已发货,快递单号:%s,预计%s送达",
order.getOrderNo(),
order.getTrackingNo(),
order.getEstimatedArrival()
);
// 多渠道发送(示例为短信)
smsClient.send(
order.getReceiverPhone(),
content,
"SHIPPING_NOTICE"
);
// 记录发送日志
logNotification(orderId, "SMS", "SUCCESS");
}
}
```
3. 消息队列配置(application.yml)
```yaml
spring:
rabbitmq:
host: rabbitmq-server
port: 5672
username: admin
password: password
listener:
simple:
acknowledge-mode: manual
prefetch: 10
```
三、部署优化方案
1. 高可用部署
- 容器化部署:Docker + Kubernetes(自动扩缩容)
- 数据库分库:按日期分表存储通知记录
- 缓存策略:Redis设置TTL(如通知记录保留7天)
2. 性能优化
```java
// 批量通知示例(减少IO)
@Transactional
public void batchSendNotifications(List orderIds) {
List orders = orderRepository.findAllById(orderIds);
Map> channelMap = orders.stream()
.collect(Collectors.groupingBy(Order::getPreferredNotifyChannel));
channelMap.forEach((channel, orderList) -> {
switch (channel) {
case "SMS": sendSmsBatch(orderList); break;
case "WECHAT": sendWechatBatch(orderList); break;
}
});
}
```
3. 监控告警
- Prometheus + Grafana监控通知成功率
- 失败通知自动重试机制(最多3次)
- 告警规则:当5分钟内失败率>5%时触发告警
四、扩展功能建议
1. 智能通知
- 根据客户偏好自动选择通知渠道
- 物流异常时自动触发升级通知
2. 多语言支持
```java
public String getLocalizedContent(Order order, Locale locale) {
return switch (locale.getLanguage()) {
case "en" -> buildEnglishContent(order);
case "es" -> buildSpanishContent(order);
default -> buildDefaultContent(order);
};
}
```
3. 通知效果分析
- 跟踪通知打开率/点击率
- A/B测试不同通知模板效果
五、部署步骤
1. 环境准备
```bash
示例:Docker部署RabbitMQ
docker run -d --name rabbitmq \
-p 5672:5672 -p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=password \
rabbitmq:3-management
```
2. 源码编译
```bash
mvn clean package -DskipTests
docker build -t fruit-notification .
```
3. 启动配置
```yaml
application-prod.yml
notification:
sms:
api-url: https://sms-gateway.example.com
app-key: your_app_key
app-secret: your_secret
retry:
max-attempts: 3
interval: 5000
```
六、常见问题处理
1. 通知延迟解决方案
- 检查消息队列积压情况
- 优化消费者并发数(`spring.rabbitmq.listener.simple.concurrency`)
2. 通知丢失处理
- 实现消息确认机制(ACK/NACK)
- 添加死信队列处理失败消息
3. 多时区支持
```java
public ZonedDateTime getLocalizedDeliveryTime(Order order) {
return order.getEstimatedArrival()
.atZone(ZoneId.of(order.getReceiverTimeZone()));
}
```
建议结合具体业务场景进行定制开发,重点考虑:
1. 水果行业的时效性要求(如冷链运输通知)
2. 批发客户的批量通知需求
3. 季节性高峰期的系统承载能力
需要更详细的某部分实现代码或部署脚本,可以进一步说明具体需求。