RabbitMQ基础知识梳理

51 阅读2分钟

概念

  • 生产者
    发送消息的应用
  • 消费者
    接收消息的应用
  • 信道
    建立在TCP连接上的虚拟连接,用于减少TCP连接,提升通信性能
  • 交换器
    用来分发消息的地方,生产者将消息发布到这里
  • 绑定
    交换器与队列之间的绑定关系,决定哪个交换器中的哪些消息分发到哪个队列
  • 队列
    用来存储消息的地方,消费者从这里订阅消息
  • vhost
    虚拟主机,一个RabbitMQ服务内可创建多个vhost,每个vhost之间相互独立,拥有各自的用户、交换器、队列,不同vhost之间互不干扰

image.png

队列

当队列有多个消费者时,消息会以循环的方式发送给消费者。
如队列queue,有三个订阅者,当来一条新消息时,会发送给subscriber1,如果subscriber1回复确认收到(ack),则queue会删除该条消息,subscriber2和subscriber3不会再收到该消息,如果subscriber1发生异常,没有收到并回复确认,则会发送给subscriber2,以此类推,但如果subscriber1没有回复确认,则下一次队列不会给他发送消息。再来新消息时,会发送给subscriber2,如果subscriber2回复确认收到,则queue会删除该条消息,subscriber1和subscriber3不会收到该消息。再来新消息时,会发送给subscriber3,以此循环类推。

graph TD
message --> queue
queue --> subscriber1
queue --> subscriber2
queue --> subscriber3

死信队列,用来存储被拒绝而不重入队列的消息的队列

交换器

  • direct
    直连交换器通过设置一个路由键(routing key)与队列进行绑定,生产者发送消息时,会携带一个路由键,当消息的路由键与直连交换器的某个路由键完全一致时,该消息会被发送到对应的队列
  • fanout
    扇形交换器会将收到的消息分发到所有绑定到的队列上
  • topic
    主题交换器与direct类似,不同的是主题交换器分发消息不是精准匹配路由键,而是通过通配符,模糊匹配路由键到相应的队列。主题交换器的路由键以 . 为分隔符,然后通过 *(匹配 . 之间的任意字符) 和 #(匹配任意字符) 通配符,实现匹配,如log.message. * 、order.#等
  • headers
    头交换器与direct类似,不同的是匹配消息的header而非路由键,但性能比direct低,不常用