rabbitmq核心
核心特性
- 消息确认机制
为了确保消息成功被消费,提供了消息确认机制,当消费者接收到消息后,比如要给一个反馈:- ack:消费成功
- nack:消费失败
- reject:拒接
- 消息过期机制
可以给每条消息指定一个有效期,一段时间内未被消费者处理,就过期了。
适合场景:清理过期数据,模拟延迟队列的实现,专门让某个程序处理过期请求 - 死信队列
为了保证消息的可靠性,比如每条消息都成功消费,需要提供一个容错机制,即:失败的消息怎么处理?
交换机
- direct交换机
允许我们将交换机和队列关联起来,指定交换机将哪种类型的消息发送给哪个队列 - topic交换机
消息会根据一个模糊的路由键转发到指定的队列,也就是是特定的一类消息可以交给特定的一类系统(程序)来处理 - rpc交换机
允许不同的程序在网络上进行通信和交互,就像调用本地函数一样。使用rpc,我们可以通过远程调用方式实现程序之间的内部通信。一般情况下,如果只是实现两个程序之间的内部通信,并没有必要借助消息队列来模拟rpc。可以使用专门的rpc框架。 - headers交换机
类似于主题和直接交换机,可以根据消息应发送到哪个队列。这种方式不是像之前那样指定一个路由键,而是根据消息的头部消息进行匹配,以确定消息要发送到哪个队列。然而,由于性能较差且相对复杂,一般情况下并不推荐使用这种方式。
生产者消息写入
每个队列当成一个客户端,当生产者发送的消息达到队列时,发服务端请求写入。
- rabbitmq启动后,对每个vhost启动两个进程,msg_store_persistent进程和msg_store_transient进程。两个进程作为服务端,队列是客户端
- 当生产者发送消息导队列时,每个队列都会向两进程发起写入请求
- 两个进程开始向磁盘写入消息。
- msg_store_persistent将持久化消息写入服务器的msg_store_persistent目录下,文件名依次为0.rdq,。。。。
- msg_store_transient将非持久化消息写入服务器的msg_store_transient目录下,。。。
消费者信息读取
- 消费者向队列中获取请求体
- 队列根据消息id去落盘文件
- 若文件存在,且未被锁住,则直接读取文件内容,返回消息给消费者。
- 若文件不存在,或已被锁住,则让rabbit_msg_store进程处理。
- 队列向两进程发送请求,进程通过gc进程去查看文件是否被锁住,同时清理垃圾,进行有效数据合并
- 若被锁住则解锁,获取消息,返回给消费者。
- 若清理垃圾后,发现还是没有此消息,则向rabbitmq其他节点发送询问请求。
- 其他节点重复上述步骤查找
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。