深入剖析 rabbitMQ(一)

简介: 在上篇关于消息队列的文章中,我们对 rabbitMQ 有过初步的介绍,本篇将将带你深入剖析 rabbitMQ 内部结构和使用。

一、关于 RabbitMQ

说到 RabbitMQ,相信大家都不会陌生,微服务开发中必不可少的中间件。

79.jpg

在上篇关于消息队列的文章中,我们了解到 RabbitMQ 本质其实是用 Erlang 开发的 AMQP(Advanced Message Queuing Protocol )的具体实现,最初起源于金融系统,主要用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面有着不俗的表现。

2010年4月,RabbitMQ 科技公司被 VMware 旗下的 SpringSource 收购,在 2013 年 5 月被并入 Pivotal 。

其实 VMware,Pivotal 本质上是一家的。不同的是,VMware 是独立上市子公司,而 Pivotal 是整合了EMC的某些资源,现在并没有上市。其中我们现在使用的 Spring 系列框架,就是 Pivotal 公司热门的产品之一。

直到后来 Pivotal 将其开源,RabbitMQ 才逐渐走向大众!

RabbitMQ 发展到今天,已经被越来越多的人认可,尤其是互联网公司,已经有着大规模的场景应用,今天我们就一起来深入了解一下 RabbitMQ。

二、RabbitMQ 模型介绍

2.1、内部结构分析

上面我们有说到 RabbitMQ 本质是 AMQP 协议的一个开源实现,在详细介绍 RabbitMQ 之前,我们先来看一下 AMQP 的内部结构图!

80.jpg

基本概念如下

  • Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序
  • Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
  • Binding:绑定,用于将消息队列和交换器之间建立关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将它理解成一个由绑定构成的路由表。
  • Queue:消息队列,用来保存消息直到发送给消费者
  • Connection:网络连接,比如一个 TCP 连接
  • Channel:信道,多路复用连接中的一条独立的双向数据流通道
  • Consumer:消息的消费者,表示一个从消息队列中取得消息的客户端应用程序
  • Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /
  • Broker:表示消息队列服务器实体
  • Message:消息实体,它由消息头和消息体组成。消息头主要由路由键、交换器、队列、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等属性组成,而消息体就是指具体的业务对象

相比传统的 JMS 模型,AMQP 主要多了 ExchangeBinding 这个新概念。

在 AMQP 模型中,消息的生产者不是直接将消息发送到Queue队列,而是将消息发送到Exchange交换器,其中还新加了一个中间层Binding绑定,作用就是通过路由键Key将交换器和队列建立绑定关系。

81.jpg

就好比类似用户表角色表,中间通过用户角色表来将用户和角色建立关系,从而实现关系绑定,在 RabbitMQ 中,消息生产者不直接跟队列建立关系,而是将消息发送到交换器之后,由交换器通过已经建立好的绑定关系,将消息发送到对应的队列!

RabbitMQ 最终的架构模型,核心部分就变成如下图所示:

82.jpg

从图中很容易看出,与 JMS 模型最明显的差别就是消息的生产者不直接将消息发送给队列,而是由Binding绑定决定交换器的消息应该发送到哪个队列,进一步实现了在消息的推送方面,更加灵活!

2.2、交换器分发策略

当消息的生产者将消息发送到交换器之后,是不会存储消息的,而是通过中间层绑定关系将消息分发到不同的队列上,其中交换器的分发策略分为四种:Direct、Topic、Headers、Fanout!

  • Direct:直连类型,即在绑定时设定一个 routing_key, 消息的 routing_key 匹配时, 才会被交换器投送到绑定的队列中去,原则是先匹配、后投送
  • Topic:按照规则转发类型,支持通配符匹配,和 Direct 功能一样,但是在匹配 routing_key的时候,更加灵活,支持通配符匹配,原则也是先匹配、后投送
  • Headers:头部信息匹配转发类型,根据消息头部中的 header attribute 参数类型,将消息转发到对应的队列,原则也是先匹配、后投送
  • Fanout:广播类型,将消息转发到所有与该交互机绑定的队列上,不关心 routing_key;
2.2.1、Direct

Direct 是 RabbitMQ 默认的交换机模式,也是最简单的模式,消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。

如果传入的 routing key 为 black,不会转发到black.green。Direct 类型交换器是完全匹配、单播的模式

83.jpg

2.2.2、Topic

Topic 类型交换器转发消息和 Direct 一样,不同的是:它支持通配符转发,相比 Direct 类型更加灵活!

两种通配符:*只能匹配一个单词,#可以匹配零个或多个。

如果传入的 routing key 为 black#,不仅会转发到black,也会转发到black.green

84.jpg

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
消息中间件 SQL Java
Rabbitmq
Rabbitmq
61 1
|
2月前
|
消息中间件 数据库 存储
一文带大家快速掌握RabbitMQ!(二)
一文带大家快速掌握RabbitMQ!
一文带大家快速掌握RabbitMQ!(二)
|
2月前
|
消息中间件 存储 网络协议
一文带大家快速掌握RabbitMQ!(一)
一文带大家快速掌握RabbitMQ!
|
2月前
|
消息中间件 网络性能优化 API
一文带大家快速掌握RabbitMQ!(三)
一文带大家快速掌握RabbitMQ!
|
4月前
|
消息中间件 存储 网络协议
RabbitMQ的使用
这篇文章详细介绍了RabbitMQ的消息中间件概念、核心组件、通过Docker的安装方法和基本使用步骤,并展示了如何在Spring Boot中整合RabbitMQ,包括依赖配置、消息的发送和接收示例。
RabbitMQ的使用
|
7月前
|
消息中间件 存储 中间件
精通 RabbitMQ 系列 01
精通 RabbitMQ 系列 01
64 0
|
消息中间件 存储 数据库
RabbitMQ特殊应用
RabbitMQ特殊应用
75 0
|
消息中间件 存储 缓存
RabbitMQ到底为什么要使用它?
在多服务体系架构中,必然存在着多个服务之间的调用关系,当用户提交了订单,订单服务会调用支付服务执行用户的金钱操作,执行完毕之后紧接着调用商品服务对商家的商品信息(库存、成交量、收入等)进行更新,执行完毕之后又调用物流服务
|
消息中间件 存储
RabbitMq
RabbitMq
135 0
|
消息中间件 前端开发 Kafka
2. 为什么要使用 RabbitMQ?
2. 为什么要使用 RabbitMQ?
87 0