Bootstrap

RabbitMQ深度探索:前置知识

  1. 消息中间件:
    1. 消息中间件基于队列模式实现异步 / 同步传输数据
    2. 作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合
  2. 传统的 HTTP 请求存在的缺点:
    1. HTTP 请求基于响应的模型,在高并发的情况下,客户端发送大量的请求达到服务器端可能会导致我们服务器处理请求堆积
    2. Tomcat 服务器处理每个请求都有自己独立的线程,如果超过最大线程数会将该请求缓存到队列中,如果请求堆积过多的情况下,可能会导致 Tomcat 服务器崩溃的问题
    3. 所以一般都会在 nginx 入口实现限流熔断。网关整合 Sentinal,整合服务保护框架
    4. HTTP 请求处理业务逻辑比较耗时的情况下,容易造成客户端一直等待,阻塞等待过程中会导致客户端超时发生重试策略,可能会引发幂等性问题
    5. 注意事项:接口是 HTTP 协议的情况下,最好不要处理比较耗时的业务逻辑,耗时的业务逻辑应该单独交给线程或者是 MQ 处理
  3. MQ 应用场景:
    1. 异步发送短信
    2. 异步发送新人优惠券
    3. 处理比较耗时的操作
    4. 方式:
      1. 单线程方式:用户需要等待四秒才会执行完毕,体验感极差
        @RestController
        public class MemberService {
        
           @RequestMapping("/mq")
            public String addMember(){
               // 1.向数据库插入数据
               System.out.println("注册会员");
        
               sms();
                return "用户注册成功";
           }
        
           public String sms(){
               System.out.println("发送短信");
               try {
                   System.out.println("正在发送短信");
                   Thread.sleep(3000);
               }catch (Exception e){
                   e.printStackTrace();
               }
               System.out.println("发送优惠券");
               System.out.println("短信发送成功");
               return "短信发送成功";
           }
        }
    5. 多线程方式:
      1. 创建异步类:
        @RestController
        public class MemberService {
        
            @Autowired
            MemberServiceAsync memberServiceAsync;
        
           @RequestMapping("/mq")
            public String addMember(){
               // 1.向数据库插入数据
               System.out.println("注册会员");
        
               //sms();
                memberServiceAsync.sms();
        
                return "用户注册成功";
           }
        }
      2. 主线程调用副线程:
        @Component
        public class MemberServiceAsync {
        
            @Async  //异步注解
            public String sms(){
                System.out.println("发送短信");
                try {
                    System.out.println("正在发送短信");
                    Thread.sleep(3000);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("发送优惠券");
                System.out.println("短信发送成功");
                return "短信发送成功";
            }
        
        }
      3. 在启动类加上注解:
      4. 多线程启动方式,用户体验感提升,用户注册完毕会员之后不用等待发送短信和优惠券的时间,就可执行别的操作
  4. 多线程处理逻辑:
    1. 用户向数据库中插入一条数据之后,在单独开启一个线程异步发送短信和优惠券操作
    2. 用户只需等待 1 秒
    3. 优点:适合于小项目实现异步
    4. 缺点:可能会消耗服务器 CPU 资源
  5. MQ 处理业务逻辑:
    1. 先向数据库中插入一条会员数据,让后向 MQ 中投递一条数据,MQ 服务器端在将消息推送给消费者异步解耦处理发送短信和优惠券
  6. MQ 与多线程之间的区别:
    1. MQ 可以实现异步 / 解耦 / 流量削峰问题
    2. 多线程也可以实现异步,但是消耗 CPU 资源,没有实现解耦
  7. MQ 消息中间件名词:
    1. Producer 生产者:投递消息到 MQ 服务器端
    2. Consumer 消费者:从 MQ 服务端获取消息处理业务逻辑
    3. Broker:MQ 服务器端
    4. Topic 主题:分类业务逻辑发送短信主题、发送优惠券主题
    5. Queue:存放消息模型、队列
      1. 先进后出,后进先出原则
      2. 底层由数组和链表实现
  8. 主流 MQ 区别对比:
;