消息队列是应用程序之间的通信方法;无需即时返回的且耗时的操作进行异步处理从而提高系统的吞吐量;可以实现程序之间的解耦合。
开发中消息队列通常有如下应用场景
1、任务异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。链式程序,提高了应用程序的响应时间;
场景说明: 用户注册后,发送邮件和短信 ,传统做法有两种:
串行发送: 将注册信息写入数据库成功后,发送注册邮件,再发送注册短信,以上三个任务完成后,返回给客户端;
并行发送:将注册信息写入数据库成功后,发送邮件的同时,再发送注册短信;以上三个任务完成后,返回给客户端;与串行的差别是,并行的方式可以提高处理的时间;
加入消息中间件后,客户端的相应时间相当于信息写入数据库的时间,注册邮件,发送短信到消息队列后,直接返回,且写入消息队列的速度很快,基本可以忽略,因此架构改变后,系统的吞吐量QPS大大提高
课程教育项目中:实现完后页面静态化,需要将生成的静态文件保存到服务器上,这时可以加个消息中间件, 静态化完成后将下载文件的消息传入消息队列中,直接返回,且写入消息队列的速度很快,基本可以忽略,因此架构改变后,系统的吞吐量QPS大大提高;
2.削峰填谷,
并发量高的时候可采取这个操作,增强cpu空闲操作.数据库处理的时间是ms级,而消息中间件是微米级的;
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉,为了解决这个问题,一般在应用前端加入消息队列;
1.可以控制活动的人数;
用户请求,服务器接收后,首先写入消息队列,加入消息队列的长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;
2.可以缓解短时间内高流量压垮应用
秒杀业务根据消息队列中的请求信息,再做后续处理;
3、应用程序解耦合
场景说明:用户下单后,订单系统需要通知库存系统,传统做法是,下单系统调用库存系统的接口
传统模式的缺点:
假如库存系统无法访问,则订单系统库存将失败,从而导致订单失败;
订单系统与库存系统耦合;
加入消息中间后, 订单系统只需用户下单后,完成持久化处理,将消息写入消息队列,返回用户订单下单成功,库存系统订阅下单的消息,采用推拉的方式,获取下单信息,进行库存操作,假如下单时库存系统不能正常使用也不会影响订单系统正常下单,实现了解耦合;
MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合.
RabbitMQ模式总结
- 不直接Exchange交换机(默认交换机)
- simple简单模式:一个生产者生产一个消息到一个队列被一个消费者接收
- work工作队列模式:生产者发送消息到一个队列中,然后可以被多个消费者监听该队列;一个消息只能被一个消费者接收,消费者之间是竞争关系
- 使用Exchange交换机;订阅模式(交换机:广播fanout、定向direct、通配符topic)
- 发布与订阅模式:使用了fanout广播类型的交换机,可以将一个消息发送到所有绑定了该交换机的队列
- 路由模式:使用了direct定向类型的交换机,消费会携带路由key,交换机根据消息的路由key与队列的路由key进行对比,一致的话那么该队列可以接收到消息
- 通配符模式:使用了topic通配符类型的交换机,消费会携带路由key(*, #),交换机根据消息的路由key与队列的路由key进行对比,匹配的话那么该队列可以接收到消息
用java访问rabbitmq,ip为搭建的环境的主机ip,端口为配置的web端口(5672),设置虚拟机,连接rabbitmq的用户,还需要设置相应的权限,才能正常连接