rabbitmq

  1. rabbitmq核心
    1. 核心特性
    2. 交换机
    3. 生产者消息写入
    4. 消费者信息读取

rabbitmq核心

核心特性

  • 消息确认机制
    为了确保消息成功被消费,提供了消息确认机制,当消费者接收到消息后,比如要给一个反馈:
    • ack:消费成功
    • nack:消费失败
    • reject:拒接
  • 消息过期机制
    可以给每条消息指定一个有效期,一段时间内未被消费者处理,就过期了。
    适合场景:清理过期数据,模拟延迟队列的实现,专门让某个程序处理过期请求
  • 死信队列
    为了保证消息的可靠性,比如每条消息都成功消费,需要提供一个容错机制,即:失败的消息怎么处理?

交换机

  • direct交换机
    允许我们将交换机和队列关联起来,指定交换机将哪种类型的消息发送给哪个队列
  • topic交换机
    消息会根据一个模糊的路由键转发到指定的队列,也就是是特定的一类消息可以交给特定的一类系统(程序)来处理
  • rpc交换机
    允许不同的程序在网络上进行通信和交互,就像调用本地函数一样。使用rpc,我们可以通过远程调用方式实现程序之间的内部通信。一般情况下,如果只是实现两个程序之间的内部通信,并没有必要借助消息队列来模拟rpc。可以使用专门的rpc框架。
  • headers交换机
    类似于主题和直接交换机,可以根据消息应发送到哪个队列。这种方式不是像之前那样指定一个路由键,而是根据消息的头部消息进行匹配,以确定消息要发送到哪个队列。然而,由于性能较差且相对复杂,一般情况下并不推荐使用这种方式。

生产者消息写入

每个队列当成一个客户端,当生产者发送的消息达到队列时,发服务端请求写入。

  1. rabbitmq启动后,对每个vhost启动两个进程,msg_store_persistent进程和msg_store_transient进程。两个进程作为服务端,队列是客户端
  2. 当生产者发送消息导队列时,每个队列都会向两进程发起写入请求
  3. 两个进程开始向磁盘写入消息。
    • msg_store_persistent将持久化消息写入服务器的msg_store_persistent目录下,文件名依次为0.rdq,。。。。
    • msg_store_transient将非持久化消息写入服务器的msg_store_transient目录下,。。。

image-20240923194541514

消费者信息读取

  1. 消费者向队列中获取请求体
  2. 队列根据消息id去落盘文件
    • 若文件存在,且未被锁住,则直接读取文件内容,返回消息给消费者。
    • 若文件不存在,或已被锁住,则让rabbit_msg_store进程处理。
  3. 队列向两进程发送请求,进程通过gc进程去查看文件是否被锁住,同时清理垃圾,进行有效数据合并
    • 若被锁住则解锁,获取消息,返回给消费者。
    • 若清理垃圾后,发现还是没有此消息,则向rabbitmq其他节点发送询问请求。
  4. 其他节点重复上述步骤查找

image-20240923194847540


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。