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