提纲:

🔥RabbitMQ

  • 特点

  • 结构

  • Exchange类型

  • 工作流程

  • 重复消费问题

  • 消息的可靠传输

  • 消息的有序传输

  • 处理大量积压的消息

  • 高可用

一、RabbitMQ

1. 特点

  • 1、解耦:使用传统的服务间远程调用方式,需要在代码中直接调用其他模块,并且其他模块的不可用会导致整个业务流程不可用;而在消息队列中,调用者仅需要将消息放入消息队列,由调用的模块订阅这个队列并取出消息进行消费,不需要知道具体调用了什么模块,以及其他模块的健康状态

  • 2、异步:传统的远程调用方式,需要等待调用的模块全部执行完毕才能返回;在消息队列中,调用者可以将消息放入消息队列后直接返回结果,由消费者异步的处理消息

  • 3、削峰/限流:假设服务器最多能一次性处理 1k 请求,在少数的某一时刻(例如秒杀)请求突增到 100k,会导致服务器的崩溃,而如果将服务器的硬件资源强行提升,会造成资源浪费;使用消息队列,可以由生产者将消息发送到消息队列,由消息队列对服务器暂时无法处理的请求进行堆积,从而实现短时间内突发的大量请求的平滑处理

2.结构

  • 1、Publisher:消息生产者

  • 2、Consumer:消息消费者

  • 3、Broker:一个 MQ 服务节点

    • Queue:消息队列

    • Exchange:交换机,根据消息的 Routing Key 找到有对应 Binding Key 的消息队列进行消息转发

  • 4、Routing Key:消息的路由关键字

  • 5、Binding Key:队列与交换机绑定时声明

  • 6、Connection:Consumer、Publisher 与 Broker 之间建立的连接,例如 TCP 连接

  • 7、Channel:信道,一个 TCP 连接可以包含多个信道,以此来多路复用一个 TCP 连接,减少连接建立和销毁的开销,MQ 的通信都是在信道中完成的

  • 8、Virtual host:虚拟主机,将不同环境的 Exchange 进行隔离

3.Exchange 类型

  • 1、Fanout Exchange:将消息发送至所有与其进行绑定的队列当中

  • 2、Direct Exchange:将消息发送至 BindingKey 与 RoutingKey 完全匹配的队列当中,是一种单播模式

  • 3、Topic Exchange:类似于通配符匹配,由 '.' 将单词隔开,将消息发送至所有匹配的队列当中

4.工作流程

  • 1、预先准备

    • 在 Publisher 服务中声明一个交换机和交换队列

    • 通过 BindingKey 将交换队列绑定至交换机