RabbitMQ详情

news2024/11/23 16:31:11

一.MQ简介

什么是MQ

MQ本质是队列,FIFO先入先出,队列中存放的内容是message(消息),还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中是常见的上下游“逻辑解耦+物理解耦”的消息通信服务。
主要用来实现流量削峰,应用解耦,异步处理等系统优化方案

为什么使用MQ

  • 流量削峰:
    例如:处理订单系统中能最大处理1万次订单,但在高峰期处理2万次订单处理不过来,只能限制1万次订单后的订单不能下单。那么有消息队列做缓冲就很好的解决这个问题,将这1秒内的订单分一段时间处理,意思没能处理的放在队列中等待直到处理完,这样比不能下单体验感好。
  • 应用解耦:
    在电商系统中有订单系统,库存系统,物流系统,支付系统,如果耦合调用它们任何一个子系统出故障下单会造成异常,这时使用消息队列后,用几分钟解决完故障后,继续处理订单,客户感受不到系统的故障,提升系统的可用性。
  • 异步处理:
    有些服务间是异步的
    例如:A调用B,B花很长时间处理完,A不知道B什么时候处理完
    以前方式解决:A过一段时间去调用B的API查询,或A提供一个callback api,B执行完调用API通知A服务。
    使用消息总线后:A调用完B后,只需监听B处理完的消息,B处理完会发一条消息给MQ,MQ将此消息转发给A服务。

AMQP和JMS

MQ是消息通信的模型,并发具体实现。现在实现MQ的有两种主流方式:AMQP、JMS。
两者间的区别和联系:
JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
JMS规定了两种消息模型;而AMQP的消息模型更加丰富

常见MQ产品

  • ActiveMQ:基于JMS
  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
  • RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
  • Kafka:分布式消息系统,高吞吐量

二.RabbitMQ(消息队列)

选用RabbitMQ

在消息队列产品的选择上,我选用了RabbitMQ。估计有很多同学质疑,为什么不选择Kafka呢?这里我需要解释几句。
消息队列产品有很多,比如说常见的有RocketMQ、RabbitMQ、ActiveMQ和Kafka。其中Kafka的性能是最好的,并发量比较大,而且消息收发的速度也非常快。但是消息收发的可靠性上,Kafka不如RabbitMQ,而且技术选型的时候执行速度并不是唯一标准。比速度的话,汇编语言碾压一切高级语言,但是现在我们写程序几乎不会选用汇编语言,而是要兼顾开发效率、易用性和生态圈。RabbitMQ还有另外一个杀手锏,那就是既支持消息异步收发,又支持同步收发,这个太牛了。虽然我们现在大部分的场景对应的是消息异步收发,但是有的场合要支持消息的同步收发,这时候RabbitMQ能适应各种业务场景的优点就显现出来了。所以在项目立项的时候,选择RabbitMQ是最稳妥的方案。

RabbitMQ概念

RabbitMQ是由erlang语言开发的,基于AMQP协议完成的消息队列,是一种应用程序之间通信是一个消息中间件,简单理解就是你发送一个包裹到快递站(RabbitMQ),然后这个快递站把包裹发送到目的地。RabbitMQ知识接收,存储,转发消息数据。

  1. 可靠性和可扩展性:
  • 强调 RabbitMQ 的可靠性特性,如消息持久化和消息确认机制,以确保消息不会丢失。
  • 提及 RabbitMQ 的可扩展性,可以通过添加更多的节点和集群来处理大量的消息负载。
  1. 用途和优点:
  • 提到 RabbitMQ 在分布式系统中的常见用途,如异步任务处理、事件驱动架构、微服务通信等。
  • 强调 RabbitMQ 的优点,包括可靠性、灵活的路由规则、丰富的功能和社区支持。

AMQP(高级消息队列协议):

AMQP(Advanced Message Queuing Protocol)是一种高级消息队列协议,用于在应用程序之间可靠地传递消息。它是一种开放标准协议,旨在提供统一的消息传递机制,使不同的应用程序或服务能够相互通信。
以下是关于 AMQP 的一些要点:

  1. 标准化协议: AMQP 是一个标准化协议,由多个参与者共同制定,其中最著名的是 AMQP 0-9-1 版本。该协议定义了消息传递的格式、交换机和队列的行为,以及客户端和代理之间的通信规则。

  2. 可靠性: AMQP 提供可靠的消息传递机制,确保消息在传输过程中不会丢失。它通过持久化消息、确认机制和事务支持等特性来保证消息的可靠性。

  3. 灵活的路由: AMQP 提供了灵活的消息路由机制。通过交换机和绑定的组合,可以将消息从生产者路由到一个或多个队列,以满足不同的消息传递需求。支持的交换机类型包括直连交换机、主题交换机、扇形交换机等。

  4. 消息持久化: AMQP 允许消息进行持久化,即使在代理或系统故障后也能保留消息。这对于对消息传递的可靠性和持久性有重要意义。

  5. 多种编程语言支持: AMQP 是一种协议,可以在多种编程语言中实现和使用。因此,您可以使用不同的编程语言来开发生产者和消费者,以便在不同的应用程序之间进行消息传递。

  6. 跨平台和云集成: AMQP 可以在不同的操作系统和云平台上运行。这使得它成为构建分布式系统、微服务架构和云集成的理想选择。

  7. 消息过期时间: 默认情况消息是无限期存储在Rabbitmq上面的,但是我们可以设置过期时间,到期后无论消息有没有被接受都会删除。

总的来说,AMQP 提供了一个通用的、可靠的消息传递协议,可以促进不同应用程序或服务之间的协作和通信。它的设计目标是支持高性能、可扩展性和可靠性,并且在各种应用场景下得到广泛应用,包括金融服务、电子商务、物联网等。

ACK应答:

消费者接受消息时,必须返回一个Ack应答,Rabbitmq才会认为这条消息接收成功。如果想删除这条消息,消费者发送Ack应答的时候,附带一个deliveryTag标志位就可以了

三种交换机:

直连交换机(Direct Exchange): 直连交换机是最简单的交换机类型之一。它根据消息的路由键(Routing Key)将消息路由到与之完全匹配的队列。当一个队列绑定到直连交换机时,需要指定一个绑定键(Binding Key),当消息的路由键与绑定键完全匹配时,消息会被路由到该队列。

主题交换机(Topic Exchange): 主题交换机根据消息的路由键与主题模式(Topic Pattern)进行匹配,并将消息路由到匹配的队列。主题模式可以使用通配符进行灵活匹配,如使用“*”表示匹配一个单词,“#”表示匹配零个或多个单词。这使得主题交换机能够支持更灵活的消息路由。

扇形交换机(Fanout Exchange): 扇形交换机将消息广播到所有绑定到它的队列,而不考虑消息的路由键。当一个队列绑定到扇形交换机时,所有发送到该交换机的消息都会被复制并发送到该队列。扇形交换机通常用于实现消息的广播机制,将消息发送给所有订阅者。

这些交换机类型提供了不同的路由策略,适用于不同的消息传递需求。根据具体的业务场景和消息的路由规则,您可以选择合适的交换机类型来实现消息的灵活路由和分发。

核心概念:

RabbitMQ 是一个开源的消息代理软件,它提供了一个消息传递系统,用于在不同的应用程序或服务之间交换数据。它基于高级消息队列协议(AMQP)构建,旨在高效处理大量的消息。
RabbitMQ 的核心概念包括以下几个方面:

  1. 消息代理: RabbitMQ 充当生产者(发送者)和消费者(接收者)之间的中间人。它接收来自生产者的消息,并根据定义的规则将它们路由到相应的消费者。

  2. 消息: 消息是 RabbitMQ 中的基本单元。它包含要传递的数据以及与该消息相关的元数据。消息可以是任何形式的数据,例如文本、JSON、XML 等。

  3. 队列: 队列是 RabbitMQ 用于存储消息的容器。当生产者发送消息时,消息首先进入队列,然后等待被消费者处理。队列遵循先进先出(FIFO)的原则,即最先进入队列的消息首先被消费。

  4. 交换机: 交换机是消息的分发中心,它接收来自生产者的消息并根据预定义的规则将其路由到一个或多个队列中。交换机的类型决定了消息的路由方式,常见的类型有直连交换机、主题交换机、扇形交换机等。

  5. 绑定: 绑定是交换机和队列之间的关联关系。它定义了消息在哪些队列上进行分发。一个队列可以绑定到一个或多个交换机上,一个交换机也可以绑定到一个或多个队列上。

  6. 消费者: 消费者是从队列中接收并处理消息的应用程序或服务。它订阅一个或多个队列,并等待消息的到达。一旦有消息可用,消费者就会处理它,并确认消息已经被消费。

通过使用 RabbitMQ,您可以实现不同应用程序或服务之间的松耦合通信。生产者可以将消息发送到 RabbitMQ,而不必关心哪个具体的应用程序或服务会接收这些消息。消费者可以独立于生产者工作,并根据自己的需求从队列中接收消息。
同时,RabbitMQ 还提供了一些高级功能,如消息持久化、消息确认机制、消息优先级等,以及可扩展性和灵活的路由配置,使您能够构建强大而可靠的消息传递系统。

工作原理:

在这里插入图片描述

Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
生产者发送消息流程:

  1. 生产者与Broker建立TCP连接
  2. 生产者与Broker建立通道
  3. 生产者通过通道消息发送给Broker,由Exchange将消息进行转发
  4. Exchange将消息转发到指定的Queue
    消费者接收消息里流程:
  5. 消费者与Broker建立TCP连接
  6. 消费者与Broker建立通道
  7. 消费者监听指定的Queue(队列)
  8. 当有消息到达Queue时Broker默认将消息推送给消费者
  9. 消费者接收到消息
  10. ack回复

同步接收和异步接收

异步:
在这里插入图片描述

异步消耗系统的资源较少,但是小程序和后端之间并不是长连接,所以后端项目异步方式接收到队列中的消息无法推送给移动端的小程序。小程序自带的消息推送机制,但是这个功能是有严格限制的,有效期和推送次数做了限制。

同步:
在这里插入图片描述

可以通过java后端项目采用同步的方式接收队列中的消息。在移动端,我们创建定时器,然后向后端java项目发出轮询请求。后端java项目接收到轮询请求后,用同步的方式接收消息队列中的消息,然后把消息队列存储在MongoDB上面,最后向小程序返回接收了多少条新消息,移动端则弹出提示框告知用户消息的消息通知

三.五种消息模型:

简单模式

一个生产者只能对应一个消费者,中间用队列连接
在这里插入图片描述

work工作模式

多个消费者去消费队列里的消息,但是队列里的消息只能被一个消费者消费,多部署几个消费者,就可以缓解压力。
在这里插入图片描述

发布/订阅(pub/sub)模式

假如我们有一个国家气象局天气预报系统,这个时候他发送消息,其他的服务商,比如百度、网易、腾讯等公司都要从国家天气预报系统那里获取天气怎么办呢?总不能百度获取了今天的天气其他公司就获取不了天气了吧,或者让国家天气预报系统给每个服务商都发送一次消息,那样显然是很麻烦的。
所以我们需要用到一个Exchange交换机角色来帮助我们把消息发给所有订阅我们的服务商。
在这里插入图片描述

Routing路由模式

路由模式不是给所有订阅他的队列发消息,而是根据路由键来确定给那个队列发消息,队列和交换机绑定时通过路由键,而生产者发消息时也需要指定路由键,这样就确定给那个队列发消息了。
在这里插入图片描述

Topics通用模式

生产者将消息发送到Topic交换机,交换机按照复杂的给咱,把消息路由到某个队列中
[图片]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1714769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wpf 使用 Prism 实战开发Day28

首页汇总方块点击导航功能 点击首页汇总方块的时候,跳转到对应的数据页面 step1: 在IndexViewModel 中,给TaskBar 里面Target 属性,赋上要跳转的页面 step2: 创建导航事件命令和方法实现 step3: 实现导航的逻辑。通过取到 IRegionManager 的…

ClickHouse 与其他数仓架构的对比——Clickhouse 架构篇(四)

文章目录 前言ClickHouse与Hive的对比计算引擎的差异ClickHouse比Hive查询速度快的原因 ClickHouse与HBase的对比HBase的存储系统与ClickHouse的异同HBase的适用场景及ClickHouse不适合的原因 ClickHouse与Kylin的对比Kylin的架构Kylin解决性能问题的思路Kylin方案的缺陷ClickH…

信息学奥赛初赛天天练-15-阅读程序-深入解析二进制原码、反码、补码,位运算技巧,以及lowbit的神奇应用

更多资源请关注纽扣编程微信公众号 1 2021 CSP-J 阅读程序1 阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填;除特 殊说明外,判断题 1.5 分,选择题 3 分) 源码 #in…

字符串编码转换

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 最早的字符串编码是美国标准信息交换码,即ASCII码。它仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASC…

贪心(临项交换)+01背包,蓝桥云课 搬砖

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0搬砖 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 将物品按照w[i] v[i]升序排序然后跑01背包就是答案 下面证明:(不要问怎么想到的,做题多了就能想到&#xff…

总负债20.79亿,银行借款在增加,经营所得现金在减少,累计亏损在增加,易点云披露其风险(四)

来源:猛兽财经 作者:猛兽财经 全文共二十五章,总计6万字。 由于篇幅所限,分为(一)到(五)篇发布。 本文为《负债20.79亿,银行借款在增加,经营所得现金在减少,易点云披露风险》&am…

力扣爆刷第146天之贪心算法五连刷

力扣爆刷第146天之贪心算法五连刷 文章目录 力扣爆刷第146天之贪心算法五连刷总结一、455. 分发饼干二、376. 摆动序列三、53. 最大子数组和四、122. 买卖股票的最佳时机 II五、5. 跳跃游戏 总结 贪心算法的本质就是选择每一阶段的局部最优,从而达到全局最优。 一…

使用手机短信恢复软件,完成从新手到专家的进阶之路

由于各种原因,如误删、手机设备损坏等,我们可能会面临重要短信丢失的风险。现在市面上有许多手机短信恢复软件可以帮助我们解决这个问题,但从新手到专家的进阶之路并非一蹴而就的过程,它需要耐心、实践和不断地学习。以下是一篇关…

c++编程(15)——list的模拟实现

欢迎来到博主的专栏——c编程 博主ID:代码小豪 文章目录 前言list的数据结构list的默认构造尾插与尾删iterator插入和删除构造、析构、赋值copy构造initializer_list构造operator 析构函数 前言 受限于博主当前的技术水平,暂时还不能模拟实现出STL当中用…

HTTP报文

HTTP报文 报文流 HTTP报文是在HTTP引用程序之间发送的数据块,这些数据块以一种文本形式的元信息开头,这些信息描述了报文的内容和含义,后面跟着可选的数据部分,这些报文在客户端,服务器和代理之间流动。 报文流入源…

Java事务入门:从基础概念到初步实践

Java事务入门:从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务?1.2 为什么需要事务? 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…

在做题中学习(62):矩阵区域和

1314. 矩阵区域和 - 力扣(LeetCode) 解法:二维前缀和 思路:读题画图才能理解意思:dun点点的是mat中的一个数,而要求的answer同位置的数 以点为中心上下左右延长 k 个单位所围成长方形的和。 因为最后answ…

拷贝构造、移动构造、拷贝赋值、移动赋值

最近在学习C的拷贝构造函数时发现一个问题:在函数中返回局部的类对象时,并没有调用拷贝构造函数。针对这个问题,查阅了一些资料,这里记录整理一下。 调用拷贝构造函数的三种情况: ① 用一个类去初始化另一个对象时&a…

PLC自动化行业的发展前景好吗?

第一先说plc的薪资: 整体的平均薪资还是非常可观的,在1.3w/月左右。 当然PLC是需要经验积累的,尤其需要拥有大型的系统设计经验,那将会在PLC以至于自动化行业都会吃的开。所以待遇是与自身的经验,能力,所在…

Java设计模式:享元模式实现高效对象共享与内存优化(十一)

码到三十五 : 个人主页 目录 一、引言二、享元设计模式的概念1. 对象状态的划分2. 共享机制 三、享元设计模式的组成四、享元设计模式的工作原理五、享元模式的使用六、享元设计模式的优点和适用场景结语 [参见]: Java设计模式:核心概述&…

GDPU Java 天码行空13

(一)实验目的 1、掌握JAVA中与网络程序开发相关的知识点; 2、理解并掌握网络编程开发思想及方法; 3、熟悉项目开发的分包方法和依据; 4、实现聊天室中客服端和服务器端的实现方法; 5、熟悉多线程程序开发方…

第五届武汉纺织大学ACM程序设计竞赛 个人题解(待补完)

前言: 上周周日教练要求打的一场重现赛,时长五个小时,题目难度还行,除了部分题目前我还写不出来之外,大部分题都写完或补完了,这边给出比赛链接和我的代码(有些是队友的)和题解。 正…

工作中有哪些超级好用的C/C++程序库?

视频和讲义发布在这里: B站链接

Spring框架温习

Spring Spring是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 Spring 特点: 轻量级、控制反转、面向切面、容器、框架集合 Spring 核心组件: Spring 常用模块&…

Leecode热题100---二分查找--4:寻找两个正序数组的中位数

题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解法1、暴力解法(归并) 思路: 合并 nums1,nums2 为第三个数组 排序第三个数…