我们一起来学RabbitMQ 二:RabbiMQ 的 6 种模式的基本应用

简介: 嗨,大家好,我是小魔童哪吒,咱们从今天开始进入开源组件的学习,一边学习一边总结一边分享文章提纲如下:• RabbitMQ 简单介绍及使用• RabbitMQ 的六种工作模式

【我们一起来学 RabbitMQ 一 】RabbitMQ 的基本介绍

嗨,大家好,我是小魔童哪吒,咱们从今天开始进入开源组件的学习,一边学习一边总结一边分享

文章提纲如下:

  • RabbitMQ 简单介绍及使用
  • RabbitMQ 的六种工作模式

本次文章不涉及编码,编码咱们统一放在下一次


RabbitMQ 简单介绍

RabbitMQ 是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。

AMQP 是什么?

高级消息队列协议,它使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能

客户端应用可以通过这个协议与消息代理和它实现的 AMQP 模型进行交互通信

MQ 是什么?

全称 Message Queue , 即消息总线

是一种跨进程、异步的通信机制

用于上下游传递消息,由消息系统来确保消息的可靠传递。

RabbitMQ 一般使用在什么场景?

  • 错峰流控
  • 保证数据的最终一致性
  • 上下游逻辑解耦
  • 具体的使用场景与下面说到的 RabbitMQ 的六种工作模式息息相关

RabbitMQ 组件中都包含了啥?

image.png

  • 消费者

可以订阅某个队列

  • 生产者

创建消息,然后发布到队列中(queue),最终将消息发送到监听的消费者

  • Broker:

一个实体,用于标识消息队列服务器

  • Virtual Host

虚拟主机

标识一批交换机、消息队列和相关对象

虚拟主机是共享相同的身份认证和加密环境的独立服务器域

每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制

  • Exchange

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列

  • Queue

消息队列,用来保存消息直到发送给消费者

它是消息的容器,也是消息的终点

一个消息可投入一个或多个队列

消息一直在队列里面,等待消费者连接到这个队列并将它取走

  • Banding

绑定,用于消息队列和交换机之间的关联

一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表

  • Channel

信道,多路复用连接中的一条独立的双向数据流通道

信道是建立在真实的TCP连接内地虚拟链接,AMQP命令都是通过新到发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成的,为了复用一条TCP连接

  • Connection

网络连接,例如一个TCP连接,可以有多个

  • Publisher

消息的生产者

也是一个向交换器发布消息的客户端应用程序

  • Consumer

消息的消费者

表示从一个消息队列中取得消息的客户端应用程序

  • Message

消息,它是由消息头和消息体组成

消息体是不透明的,而消息头则是由一系列的可选属性组成

这些属性包括如下参数

  • routing-key (路由键)
  • priority (优先级)
  • delivery-mode (消息可能需要持久性存储[消息的路由模式])

市面上都有哪些 MQ ?

  • RabbitMQ
  • Kafka
  • ActiveMQ
  • ZeroMQ
  • RocketMQ

那么我们为啥选择 RabbitMQ ?

咱们来看看 RabbitMQ 的特点

  • 可靠性

RabbitMQ 使用了 持久化、传输确认、发布确认 等 机制来保证可靠性

  • 灵活的路由

在消息进入队列之前,通过Exchange来路由消息

对于典型的路由功能,RabbitMQ 已经提供了一些内置的Exchange来实现

对于复杂的路由功能,RabbitMQ  可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange

  • 消息集群

多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker

  • 高可用

RabbitMQ 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用

  • 多种语言客户端

几乎支持所有常用语言,比如Java、.NET、Ruby、GO

  • 管理界面

提供了易用的用户界面,使得用户可以监控和管理消息 Broker

  • 跟踪机制

如果消息异常,RabbitMQ 提供了消息的跟踪机制,使用者可以找出具体发生了什么

  • 插件机制

提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件

RabbitMQ 的六种工作模式

图片来源于 RabbitMQ 官方文档 www.rabbitmq.com/getstarted.…

simple 简单模式

简单的消息生产者和简单的消费者的关系,生产者生产消息,放到队列中,消费中消费队列中的消息

image.png

  • 消息产生者将消息放入队列
  • 消息的消费者监听消息队列,如果队列中有消息就消费掉

消息被拿走后,自动从队列中删除

work 工作模式

多个消费端消费同一个队列中的消息,队列采用轮询的方式将消息是平均发送给消费者,此处的资源是竞争关系

image.png

  • 消息产生者将消息放入队列,这里的消费者可以有多个

消费者C1,消费者C2,同时监听同一个队列

消息被消费者C1,C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息

这里就会有这样的问题,同一个消息会被不同的消费者都消费掉,我们需要处理这种问题

可以设置一个开关,syncronize,保证一条消息只能被一个消费者使用

  • 用于场景
  • 红包场景
  • 大型项目中的资源调度

publish/subscribe 发布订阅模式

publish/subscribe 发布订阅模式 , 相对于Work queues模式多了一个交换机,此处的资源是共享的

生产端先把消息发送到交换机,再由交换机把消息发送到绑定的队列中,每个绑定的队列都能收到由生产端发送的消息

image.png

  • X 代表交换机 RabbitMQ 内部组件,每个消费者监听自己的队列
  • 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收 到消息
  • 用于场景
  • 邮件群发
  • 群聊天
  • 广播(广告等)

routing 路由模式

image.png

  • 每个消费者监听自己的队列,并且设置带统配符的 routingkey
  • 生产者将消息发给broker,由交换机根据 routingkey 来转发消息到指定的队列

大致涉及的流程如下:

生产者处理流程:

声明队列并声明交换机 -> 创建连接 -> 创建通道 -> 通道声明交换机 -> 通道声明队列 -> 通过通道使队列绑定到交换机并指定该队列的routingkey(通配符) -> 制定消息 -> 发送消息并指定routingkey(通配符)

消费者处理流程:

声明队列并声明交换机 -> 创建连接 -> 创建通道 -> 通道声明交换机 -> 通道声明队列 -> 通过通道使队列绑定到交换机并指定routingkey(通配符) -> 重写消息消费方法 -> 执行消息方法

Topics 模式实际上是路由模式的一种

他俩的最大的区别是 : Topics 模式发送消息和消费消息的时候是通过通配符去进行匹配的

image.png

通配符有如下注意点:

  • */#星号或者井号代表通配符
  • 星号代表多个单词,而井号代表一个单词
  • 路由功能添加模糊匹配
  • 消息生产者生产消息,把消息交给交换机 exchange
  • 交换机 exchange 根据 key 的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

RPC  模式

RPC 远程过程调用,客户端远程调用服务端的方法 ,使用 MQ 可以实现 RPC 的异步调用

image.png

这是基于Direct交换机实现的,流程如下:

  • 客户端即是生产者也是消费者,向 RPC 请求队列发送 RPC 调用消息,同时监听RPC响应队列
  • 服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果
  • 服务端将RPC方法 的结果发送到RPC响应队列。
  • 客户端监听RPC响应队列,接收到RPC调用结果

总结

  • RabbitMQ是一套开源(MPL)的消息队列服务软件
  • RabbitMQ 组件中都包含如下部分
  • 生产者
  • 消费者
  • broker  实体
  • virtual host 虚拟机
  • exhcnage 交换机
  • binding 绑定关系
  • queue 队列
  • connection 连接
  • channel 信道
  • message 消息
  • 选择 RabbitMQ  的原因有哪些
  • RabbitMQ 的六种工作模式:
  • simple 简单模式
  • work 工作模式
  • publish/subscribe 订阅发布模式
  • routing 路由模式
  • RPC 模式

参考资料:

RabbitMQ Tutorials

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关实践学习
消息队列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
相关文章
|
7天前
|
消息中间件
RabbitMQ的 RPC 消息模式你会了吗?
【9月更文挑战第11天】RabbitMQ 的 RPC(远程过程调用)消息模式允许客户端向服务器发送请求并接收响应。其基本原理包括:1) 客户端发送请求,创建回调队列并设置关联标识符;2) 服务器接收请求并发送响应至回调队列;3) 客户端根据关联标识符接收并匹配响应。实现步骤涵盖客户端和服务器的连接、信道创建及请求处理。注意事项包括关联标识符唯一性、回调队列管理、错误处理及性能考虑。RPC 模式适用于构建可靠的分布式应用程序,但需根据需求调整优化。
|
27天前
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
39 2
|
1月前
|
消息中间件
RabbitMQ广播模式
RabbitMQ广播模式
38 1
|
22天前
|
消息中间件 应用服务中间件 网络安全
rabbitMQ镜像模式搭建
rabbitMQ镜像模式搭建
|
25天前
|
消息中间件 开发工具
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
|
2月前
|
消息中间件 传感器 负载均衡
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
消息队列 MQ使用问题之如何配置一主一从的同步复制模式
|
1月前
|
消息中间件 Java Maven
RabbitMQ通配符模式
RabbitMQ通配符模式
36 0
|
2月前
|
消息中间件 Java Apache
消息队列 MQ使用问题之如何在内外网环境下使用单组节点单副本模式
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。