应用场景
1. 异步处理
场景:用户注册完成后,需要发注册成功的邮件和短信,传统的做法有两种:
-
串行的方式:将注册信息写入数据库后,发送注册成功的邮件,邮件发送成功后,再发送注册成功的短信。以上三个任务全部完成后才将注册成功的信息返回给客户端。存在的问题是:邮件和短信并不是必须的,它只是一个通知,串行的方式会让客户端等待没有必要等待的时间。
-
并行的方式:将注册信息写入数据库后,同时发送注册成功的邮件和短信。以上三个任务全部完成后才将注册成功的信息返回给客户端。并行的方式能相应的提高处理的时间。
-
消息队列(Publish/Subscribe)的方式:将注册信息写入数据库后直接将注册成功的信息返回给客户端。然后将发送注册成功的邮件的消息和发送注册成功的短信的消息发送到Exchange中,Exchange再将消息分发给两个队列,由两个队列异步地通知对应的消费者进行消费。
2. 应用解耦
场景:双11是购物狂节,在用户下单时,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。
这种做法有一个缺点:当库存系统出现故障时,订单系统的调用就会失败,进而导致整个请求失败。订单系统和库存系统之间高耦合。
引入消息队列("Hello World!")后:
-
订单系统:用户下单后,订单系统完成持久化处理,再将消息写入消息队列,返回用户订单下单成功。
-
库存系统:消息队列将消息发送给库存系统,库存系统进行相应操作。就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
3. 流量削峰
场景:在秒杀活动中,如果用户直接访问应用,那么一般会因为流量过大,导致应用挂掉。为了解决这个问题,一般在应用前端加入消息队列。
加入消息队列("Hello World!")作用是:
-
可以控制活动人数,如果订单信息的数量超过MQ规定的阈值,新的订单信息直接丢弃。
-
可以缓解短时间的高流量压垮应用,系统只和MQ对接,因此系统只会依次消费MQ发送的一条条消息,不会出现多个请求同时访问系统的场景,最终导致系统崩溃。
具体实现流程为:
-
服务器收到用户