1、解耦、削峰、异步
同步异步的问题(串行)
串行方式:创建订单信息 ---> 发送注册邮件 ---> 再发送注册短信,完成以上三个步骤之后,返回给客户端。
public void order(){
//1、创建订单
orderService.saveOrder();
//2、发送邮件
emailService.sendEmail();
//3、发送短信
smsService.sendSMS();
//4、发送app服务
appService.sendApp();
}
并行方式 异步线程池
并行方式:创建订单信息成功后,在发送注册邮件的同时,发送注册短信,完成以上步骤之后,返回给客户端。
public void order(){
//1、创建订单
orderService.saveOrder();
//相关发送
relationMessage();
}
public void relationMessage(){
//异步
threadPool.submit(new Callable<Object>{
public Object sms(){
//2、发送短信
smsService.sendSMS();
}
})
//异步
threadPool.submit(new Callable<Object>{
public void email(){
//3、发送邮件
emailService.sendEmail();
}
})
......
}
存在的问题:
- 耦合度高
- 需要维护自定义的线程池
- 消息可能会丢失
- 消息可靠性低
- 需考虑服务器可用性的问题
异步消息队列方式
优点:
1、完全解耦,使用MQ进行桥接
2、有独立的线程池和运行模式
3、消息持久化功能等
public void order(){
//1、创建订单
orderService.save();
rabbitTemplate.convertSend("exchange","2","消息内容");
}
2、高内聚 低耦合
图片来源:学相伴 飞哥-RabbitMQ
评论 (0)