概念
- 生产者
发送消息的应用 - 消费者
接收消息的应用 - 信道
建立在TCP连接上的虚拟连接,用于减少TCP连接,提升通信性能 - 交换器
用来分发消息的地方,生产者将消息发布到这里 - 绑定
交换器与队列之间的绑定关系,决定哪个交换器中的哪些消息分发到哪个队列 - 队列
用来存储消息的地方,消费者从这里订阅消息 - vhost
虚拟主机,一个RabbitMQ服务内可创建多个vhost,每个vhost之间相互独立,拥有各自的用户、交换器、队列,不同vhost之间互不干扰
队列
当队列有多个消费者时,消息会以循环的方式发送给消费者。
如队列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低,不常用