工作队列模式和路由模式使用场景最多

主题模式极少使用

1、解耦、削峰、异步

为什么使用rabbitMQ

之前的系统架构单一,但体结构所有业务都是堆积在一个里,后来拆分为分布式架构,拆分后的模块之间需要进行通讯,决定采用消息队列,最终选择RabbitMQ,核心的点就是一个异步的,是一个多线程机制,分发机制,让网站性能会得以成倍提升,因为他的异步让我们处理数据更快高校,更加稳健

同步异步的问题

串行执行

例如:生成订单之后需要发送消息
image.png

  1. public class makeOrder {
  2. // 1.保存订单
  3. orderService.save();
  4. // 2.发送短信服务
  5. messageService.sendMessage();
  6. // 3.发送emile服务
  7. emileService.sendEmile();
  8. // 4.发送APP通知服务
  9. appService.sendApp();
  10. }

最后的代码执行总耗时为全部执行的总共时间

并行执行

Java中想要并行执行只能使用多线程
使用异步线程池进行并行执行
改造之后:
将订单信息写入数据库后,开启多个线程同时执行发送短信,邮件,消息,执行完毕之后再返回给客户端
image.png

但是使用线程池有着以下几个问题:

  • 关键代码实现耦合在了应用程序中,耦合度高
  • 需要自己维护线程池,维护成本过高
  • 消息可能会丢失,需要自己实现消息补偿机制
  • 持久性,高可靠,高可用都需要自己实现
  • 共享一个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镜像模型高可用

image.png

public class makeOrderMQ {
    public void makeOrderMQ() {
        //    1.保存订单
        orderService.save();
        //    2.MQ执行相关服务
        rabbitmqTemplate.convertSend()
    }
}

响应时间为业务执行时间+MQ消息投递的执行时间,但是MQ投递速度很快,相当于忽略不计

2、高内聚、低耦合

后续如果还有其他的服务需要进行消息推送,可以直接在MQ中进行扩展,不用再动代码

3、MQ应用场景

  • 交易系统
  • 红包秒杀
  • 关闭未支付订单
  • 用户信息注册
  • 在线抽奖设计
  • 任务系统设计
  • 跨私网数据交换
  • 跨区域数据同步
  • 异步解耦
  • 削峰解耦
  • 顺序消息
  • 分布式事务消息
  • 大数据分析
  • 分布式模缓存同步
  • 异地多活
  • 异步通知
  • 分布式缓存同步
  • 日志监控(ELK)