RocketMq的应用场景

一般执行比较耗时的代码操作时,都可以交给mq异步实现接口:比如使用mq异步发送优惠券、扣库存,异步发送短信、邮件,也可以异步收集系统日志从而和应用服务进行解耦等多种应用场景;

 

客户端发送请求到服务端,服务端相应的接口接收到请求后会开启线程进行处理,如果执行代码需要较长时间,接口响应比较慢,导致客户端一直处于阻塞状态;对于上面提到的比较耗时、不可控的业务逻辑处理接口,可以采用多线程或者mq等异步的方式进行处理;

 

request请求发送到服务端后,会向数据库中插入一条数据,数据插入成功后,producer发送一条短信相关内容到mq消息队列,消息队列会遵循先进先出,后进后出的原则,通过consumer从队列中拉取信息,然后再异步发送出去,实现过程中会员服务和短信、优惠券发送服务是解耦的,分开的,短信发送服务和会员服务可以部署在不同的服务器,即使会员服务宕机了也不会影响短信的发送;而通过多线程异步实现的话,这个过程仍然是在同一个jvm中实现,没有实现解耦。因此在大型项目中建议使用mq而非多线程实现异步处理;

服务端处理每个客户端请求实际上会单独开启一个线程,tomcat的默认线程数50个,如果客户端的请求并发数超过50,超过的请求队列会缓存到队列中,如果请求比较耗时,tomcat没有空闲的线程进行处理,会导致后面的请求全部阻塞,甚至导致崩溃,因此尽可能保证tomcat的处理时间在毫秒级别,把请求耗时较长的处理逻辑全部交给mq异步执行;

mq的架构特性:

1)异步处理

2)实现解耦

3)流量消峰,mq可以实现抗高并发

mq和多线程的区别:

1)都能实现异步处理,如果多线程开启过多(当开启线程数大于cpu的核数时),cpu上下文切换更加频繁,降低效率,消耗更多cpu资源;其次,在业务执行过程中发生应用线程和异步执行线程可能会发生cpu竞争,从而造成应用业务的卡顿;

2)mq的异步实现是完全解耦的,适合大型互联网项目;

3)小的项目可以使用多线程方式实现异步

 

posted @ 2022-09-06 11:59  明胖胖  阅读(844)  评论(0)    收藏  举报