在之前的 Java 理解生产者-消费者设计模式 一文中,我们学习了生产者-消费者模式,生产者和消费者之间通过一个缓冲队列进行通讯,即做到了异步消息吞吐,又使得程序解耦
可以说,使用 MQ(消息队列) 可以在分布式环境中实现生产者-消费者模式
适合MQ使用的场景
- 消息的发送者和消费者需要解耦的情况
- 异步处理
- 多个消费者(消息的关注者不止一个)
- 消费者的处理结果不返回给发送者 (以RabbitMQ为例,虽然可以做到RPC调用,但是这种调用会带来更多的麻烦)
- 削峰填谷
下面我跟详细分析一下各种使用场景
解耦
其实很好理解,因为生产者和消费者通过MQ进行通讯,可以说两者没有什么直接的瓜葛,必然解耦
异步 && 多个消费者
生产者只负责把消息发布,并在意谁处理消息,可能会有多个消费者处理该消息
例如用户注册,我们会给用户发送注册邮件和短信(可以把邮件和短信理解为多个消费者服务)
可以看到在使用了MQ,即可以通过异步处理的方式,降低响应时间,又可以降低业务之间的耦合度
消费者的处理结果不返回给发送者
线程池和MQ都可以看成 生产者-消费者模式的实现,而这两者也都可以获得消费者的返回值。但是如果你这样做的话,你的生产者线程会阻塞(等待消费者的返回),没法做到完全异步的处理,有些违背了生产者-消费者模式的初衷。而且还要考虑等待超时后的处理。但是不能说这种用法是不对的,具体业务具体分析
削峰填谷
何为削峰填谷,可以理解为流量控制。例如在抢票,秒杀等业务场景时,可能会突然有大量的请求涌入。但是我们的服务器资源有限,并不能处理这么多的请求,此时可以使用 MQ进行流量控制
因为,请求都缓存在了MQ中,下游服务可以根据自己的速度进行处理。