工作队列模式和路由模式使用场景最多
主题模式极少使用
1、解耦、削峰、异步
为什么使用rabbitMQ
之前的系统架构单一,但体结构所有业务都是堆积在一个里,后来拆分为分布式架构,拆分后的模块之间需要进行通讯,决定采用消息队列,最终选择RabbitMQ,核心的点就是一个异步的,是一个多线程机制,分发机制,让网站性能会得以成倍提升,因为他的异步让我们处理数据更快高校,更加稳健
同步异步的问题
串行执行
例如:生成订单之后需要发送消息
public class makeOrder {
// 1.保存订单
orderService.save();
// 2.发送短信服务
messageService.sendMessage();
// 3.发送emile服务
emileService.sendEmile();
// 4.发送APP通知服务
appService.sendApp();
}
最后的代码执行总耗时为全部执行的总共时间
并行执行
Java中想要并行执行只能使用多线程
使用异步线程池进行并行执行
改造之后:
将订单信息写入数据库后,开启多个线程同时执行发送短信,邮件,消息,执行完毕之后再返回给客户端
但是使用线程池有着以下几个问题:
- 关键代码实现耦合在了应用程序中,耦合度高
- 需要自己维护线程池,维护成本过高
- 消息可能会丢失,需要自己实现消息补偿机制
- 持久性,高可靠,高可用都需要自己实现
共享一个JVM内存,不利于扩展
public class makeOrderThread { public void makeOrderThread() { // 1.保存订单 // orderService.save(); // 2.多线程执行相关服务 relationService(); } public void relationService() { // 多线程执行 threadpool.submit(new Callable<Object>{ // 2.发送短信服务 messageService.sendMessage(); }) // 3.发送emile服务 threadpool.submit(new Callable<Object> { emileService.sendEmile(); }) // 4.发送APP通知服务 threadpool.submit(new Callable<Object> { appService.sendApp(); }) } }
响应时间为业务执行时间+消息发送的最长的执行时间
异步消息队列
这是最好的解决方法
有着以下好处:
- 完全解耦,使用MQ建立桥接
- 有独立的线程池和运行模型
- 消息丢失,MQ有着持久化的功能
- 能保证消息的可靠性,死信队列和消息转移的等待
- 可以自己手动编写高可用,HA镜像模型高可用
public class makeOrderMQ {
public void makeOrderMQ() {
// 1.保存订单
orderService.save();
// 2.MQ执行相关服务
rabbitmqTemplate.convertSend()
}
}
响应时间为业务执行时间+MQ消息投递的执行时间,但是MQ投递速度很快,相当于忽略不计
2、高内聚、低耦合
后续如果还有其他的服务需要进行消息推送,可以直接在MQ中进行扩展,不用再动代码
3、MQ应用场景
- 交易系统
- 红包秒杀
- 关闭未支付订单
- 用户信息注册
- 在线抽奖设计
- 任务系统设计
- 跨私网数据交换
- 跨区域数据同步
- 异步解耦
- 削峰解耦
- 顺序消息
- 分布式事务消息
- 大数据分析
- 分布式模缓存同步
- 异地多活
- 异步通知
- 分布式缓存同步
- 日志监控(ELK)