理解消息队列 - 使用场景简介

在之前的 Java 理解生产者-消费者设计模式 一文中,我们学习了生产者-消费者模式,生产者和消费者之间通过一个缓冲队列进行通讯,即做到了异步消息吞吐,又使得程序解耦

可以说,使用 MQ(消息队列) 可以在分布式环境中实现生产者-消费者模式

适合MQ使用的场景

  • 消息的发送者和消费者需要解耦的情况
  • 异步处理
  • 多个消费者(消息的关注者不止一个)
  • 消费者的处理结果不返回给发送者 (以RabbitMQ为例,虽然可以做到RPC调用,但是这种调用会带来更多的麻烦)
  • 削峰填谷

下面我跟详细分析一下各种使用场景

解耦

image.png

其实很好理解,因为生产者和消费者通过MQ进行通讯,可以说两者没有什么直接的瓜葛,必然解耦

异步 && 多个消费者

生产者只负责把消息发布,并在意谁处理消息,可能会有多个消费者处理该消息

例如用户注册,我们会给用户发送注册邮件和短信(可以把邮件和短信理解为多个消费者服务)

传统方式,图片来源网络

使用MQ,图片来源网络

可以看到在使用了MQ,即可以通过异步处理的方式,降低响应时间,又可以降低业务之间的耦合度

消费者的处理结果不返回给发送者

线程池和MQ都可以看成 生产者-消费者模式的实现,而这两者也都可以获得消费者的返回值。但是如果你这样做的话,你的生产者线程会阻塞(等待消费者的返回),没法做到完全异步的处理,有些违背了生产者-消费者模式的初衷。而且还要考虑等待超时后的处理。但是不能说这种用法是不对的,具体业务具体分析

削峰填谷

何为削峰填谷,可以理解为流量控制。例如在抢票,秒杀等业务场景时,可能会突然有大量的请求涌入。但是我们的服务器资源有限,并不能处理这么多的请求,此时可以使用 MQ进行流量控制

图片来源网络

因为,请求都缓存在了MQ中,下游服务可以根据自己的速度进行处理。

参考

https://www.kancloud.cn/cosmicyang/rabbitmq/824050