消息队列
说到消息中间件,我使用比较多的就是RabbitMQ。在分布式系统中,不同模块之间的通信,除了可以使用 RPC方式进行调用外,MQ也是另外一种方式,也是进程之间进行通信的一种方法。
消息队列:传递消息的队列。参与传递消息的双方称为生产者、消费者。生产者和消费者可以只有一个实例,也可以集群部署。
- 消息体:生产者和消费者之间传递的数据
- 消息格式:可以是简单字符串或者序列化后的复杂文档信息
- 队列:消息的载体,用于传输和保存消息(类似于数据结构的队列,先进先出)
作用
系统解耦
当某项业务涉及多个业务数据,我们通过使用消息队列,在系统中隐含地加入一个对外的扩展接口,对业务进行接口,使得上游业务只管发消息而不用关注下游的逻辑如何执行。
这也符合开闭原则设计模式,软件实体对扩展开发,对修改关闭,尽量保持系统之间的独立。
场景:业务完成后通知用户业务完成,通过增加消息队列,由下游进行通知,上游专处理业务相关,业务解耦。
异步处理
在处理高并发、高可用等系统设计时,某业务受限于系统承载能力或处理时长过长,无法立即处理完成,可使用消息队列,将请求异步化。
场景:电商的秒杀场景,通过消息队列进行流量削峰。
请求缓冲
通过一个队列实现一个缓冲层,平滑各个业务系统之间的处理性能的不同等
数据分发
消息队列有不同的订阅模式,支持一对多广播机制,可以用来实现数据的分发。
场景:电商平台某最后一件商品被下单购买后,下游的业务可能包含多个,比如减库存,记录日志,通知供应商,更新最新库存等等,此时可以通过消息队列来实现数据的分发。
其实,比较常见的消息队列有Kafka、RocketMQ、RabbitMQ,都可以实现以上相关的场景,但它们之间还有很多差异。