嗨,大家好,我是小魔童哪吒,咱们从今天开始进入开源组件的学习,一边学习一边总结一边分享
文章提纲如下:
本次文章不涉及编码,编码咱们统一放在下一次
RabbitMQ 是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
高级消息队列协议
,它使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能
客户端应用可以通过这个协议与消息代理和它实现的 AMQP
模型进行交互通信
全称 Message Queue
, 即消息总线
是一种跨进程、异步的通信机制
用于上下游传递消息,由消息系统来确保消息的可靠传递。
RabbitMQ
的六种工作模式息息相关可以订阅某个队列
创建消息,然后发布到队列中(queue),最终将消息发送到监听的消费者
Broker:
一个实体,用于标识消息队列服务器
Virtual Host
虚拟主机
标识一批交换机、消息队列和相关对象
虚拟主机是共享相同的身份认证和加密环境的独立服务器域
每个vhost
本质上就是一个mini版的RabbitMQ
服务器,拥有自己的队列、交换器、绑定和权限机制
Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
Queue
消息队列,用来保存消息直到发送给消费者
它是消息的容器,也是消息的终点
一个消息可投入一个或多个队列
消息一直在队列里面,等待消费者连接到这个队列并将它取走
Banding
绑定,用于消息队列和交换机之间的关联
一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表
Channel
信道,多路复用连接中的一条独立的双向数据流通道
信道是建立在真实的TCP
连接内虚拟链接,AMQP
命令都是通过新到发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成的,为了复用一条TCP连接
Connection
网络连接,例如一个TCP连接,可以有多个
Publisher
消息的生产者
也是一个向交换器发布消息的客户端应用程序
Consumer
消息的消费者
表示从一个消息队列中取得消息的客户端应用程序
Message
消息,它是由消息头和消息体组成
消息体是不透明的,而消息头则是由一系列的可选属性组成
这些属性包括如下参数
routing-key
(路由键)priority
(优先级)delivery-mode
(消息可能需要持久性存储[消息的路由模式])咱们来看看 RabbitMQ
的特点
可靠性
RabbitMQ
使用了 持久化、传输确认、发布确认 等 机制来保证可靠性
灵活的路由
在消息进入队列之前,通过Exchange
来路由消息
对于典型的路由功能,RabbitMQ
已经提供了一些内置的Exchange
来实现
对于复杂的路由功能,RabbitMQ
可以将多个Exchange
绑定在一起,也通过插件机制实现自己的Exchange
消息集群
多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker
高可用
RabbitMQ 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用
多种语言客户端
几乎支持所有常用语言,比如Java、.NET、Ruby、GO
等
管理界面
提供了易用的用户界面,使得用户可以监控和管理消息 Broker
跟踪机制
如果消息异常,RabbitMQ 提供了消息的跟踪机制,使用者可以找出具体发生了什么
插件机制
提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件
图片来源于 RabbitMQ 官方文档 https://www.rabbitmq.com/getstarted.html
简单的消息生产者和简单的消费者的关系,生产者生产消息,放到队列中,消费中消费队列中的消息
消息被拿走后,自动从队列中删除
多个消费端消费同一个队列中的消息,队列采用轮询的方式将消息是平均发送给消费者,此处的资源是竞争关系
消费者C1,消费者C2,同时监听同一个队列
消息被消费者C1,C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息
这里就会有这样的问题,同一个消息会被不同的消费者都消费掉,我们需要处理这种问题
可以设置一个开关,syncronize
,保证一条消息只能被一个消费者使用
publish/subscribe 发布订阅模式 , 相对于Work queues模式多了一个交换机,此处的资源是共享的
生产端先把消息发送到交换机,再由交换机把消息发送到绑定的队列中,每个绑定的队列都能收到由生产端发送的消息
RabbitMQ
内部组件,每个消费者监听自己的队列broker
,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收 到消息routingkey
routingkey
来转发消息到指定的队列大致涉及的流程如下:
生产者处理流程:
声明队列并声明交换机 -> 创建连接 -> 创建通道 -> 通道声明交换机 -> 通道声明队列 -> 通过通道使队列绑定到交换机并指定该队列的routingkey(通配符) -> 制定消息 -> 发送消息并指定routingkey(通配符)
消费者处理流程:
声明队列并声明交换机 -> 创建连接 -> 创建通道 -> 通道声明交换机 -> 通道声明队列 -> 通过通道使队列绑定到交换机并指定routingkey(通配符) -> 重写消息消费方法 -> 执行消息方法
Topics 模式实际上是路由模式的一种
他俩的最大的区别是 :Topics 模式发送消息和消费消息的时候是通过通配符去进行匹配的
通配符有如下注意点:
*/#
星号或者井号代表通配符exchange
key
的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费RPC
模式RPC
远程过程调用,客户端远程调用服务端的方法 ,使用 MQ
可以实现 RPC
的异步调用
这是基于Direct交换机
实现的,流程如下:
RPC
请求队列发送 RPC
调用消息,同时监听RPC
响应队列RPC
请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果RPC
方法 的结果发送到RPC
响应队列。RPC
响应队列,接收到RPC
调用结果RabbitMQ
是一套开源(MPL)的消息队列服务软件RabbitMQ
的原因有哪些RabbitMQ
的六种工作模式:参考资料:
RabbitMQ Tutorials
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~