1.1 同步异步问题(串行)
串行方式:将订单信息写入数据库成功后,发送注册邮件,再发送短信。以上三个任务全部完成后,返回给客户端。
public void makrOrder() {
// 1.订单保存
orderService.saveOrder();
// 2.发送短信服务
messageService.sendSMS("order");
// 3.发送email服务
emailService.sendEmail("order");
// 4.发送 APP 服务
appService.sendApp("order");
}
1.2 并行方式 异步线程池
并行方式:将订单信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。
缺点:需要自己维护线程池、持久性、高可用,高可用都需要自己实现,最重要的是耦合在应用程序中。
public void makeOrder() {
// 1.保存订单
orderService.saveOrder();
// 发送
relationMessage();
}
public void relationMessage() {
// 异步
threadpool.submit(new Callable<Object>{
public Object call() {
// 发送短信服务
messageService.sendSMS("order");
}
});
// 异步
threadpool.submit(new Callable<Object>{
public Object call() {
// 发送email服务
messageService.sendEmail("order");
}
});
// 异步
threadpool.submit(new Callable<Object>{
public Object call() {
// 发送email服务
messageService.sendApp("order");
}
});
}
1.3 异步消息队列
完全解耦,用 MQ 建立桥梁
有独立的线程池和运行模块
出现了消息坑会丢失,MQ 有持久化功能
如何保证消息的可靠性,死信队列和消息转移等
如果服务器承载不了,需要自己去写高可用,HA 镜像模型高可用
public void makeOrder() {
orderService.saveOrder();
rabbitTemplate.convertSend("ex","2","消息内容");
}
2、高内聚,低耦合
3、流量的削峰
4、分布式事务的可好消费和可靠生产
5、索引、缓存、静态化处理的数据同步
6、流量监控
7、日志监控(ELK)
8、下单、订单分发、抢票