RabbitMQ详情

一.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.mzph.cn/news/844624.shtml

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

相关文章

电脑突然提示:“failed to load steamui.dll”是什么情况?分享几种解决steamui.dll丢失的方法

相信有一些用户正在面临一个叫做“failed to load steamui.dll”的问题,这种情况多半发生在试图运行某个程序时,系统会提示一条错误消息:“failed to load steamui.dll”。那么,为何steamui.dll文件会丢失,又应该如何解…

cf练习5.29

A ac代码 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;int main() {IOSint t;cin>>t;while(t--){int ans0;int a,b;cin>>a>>b;if(b0){if(a%150) ansa/15;else ansa/151;}else if(b!0…

鸿蒙开发接口图形图像:【@ohos.window (窗口)】

窗口 窗口提供管理窗口的一些基础能力&#xff0c;包括对当前窗口的创建、销毁、各属性设置&#xff0c;以及对各窗口间的管理调度。 该模块提供以下窗口相关的常用功能&#xff1a; [Window]&#xff1a;当前窗口实例&#xff0c;窗口管理器管理的基本单元。[WindowStage]&…

Spring Cloud Gateway 集成 Nacos、Knife4j

目录 1、gateway网关配置1.1 pom 配置2.2 配置文件1.3 yaml 配置 2、其他服务配置2.1 pom 配置2.2 配置文件2.3 yaml 配置 3、界面访问4、其他 官方文档地址&#xff1a;Spring Cloud Gateway集成Knife4j 官方完整源码&#xff1a;https://gitee.com/xiaoym/swagger-bootstrap-…

扒出秦L三个槽点,我不考虑买它了

文 | Auto芯球 作者 | 雷慢 比亚迪的有一个王炸“秦L”&#xff0c;再一次吸引了我注意力&#xff0c; 我上一辆车刚卖不久&#xff0c;最近打算买第二辆车&#xff0c; 二手车和新车都有在看&#xff0c; 我又是一个坚定的实用主义者&#xff0c; 特别是现在的经济环境不…

P10-P11【重载,模板,泛化和特化】【分配器的实现】

三类模板&#xff08;类模板&#xff09;&#xff08;函数模板&#xff09;&#xff08;成员函数模板&#xff09; 特化 偏特化&#xff1a;模板参数个数/模板范围 定义的分配器 以上分配器的性能和内存管理有很大不足&#xff08;在分配内存时&#xff0c;会产生很大的内存开…

【C语言训练题库】杨辉三角(下三角型和金字塔型)

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 题目&#xff1a;打印杨辉三角 1. 下三角型 1.1 图例: 1.2. 解析: 1.3. 代码: 1.4. 运行&#xff1a; 2. 金字塔型 2.1 图例 2.2. 解析 2.2.1. 打印金…

php 安装 swoole扩展

一 在swoole官网查询适配版本Swoole 文档 2. php环境为7.3下载 4.8 ​ wget https://pecl.php.net/get/swoole-4.6.6.tgztar -zxvf swoole-4.6.6.tgzcd swoole-4.6.6/usr/local/php7/bin/phpize​ ./configure --enable-openssl --enable-sockets --enable-mysqlnd --enabl…

HCIP-Datacom-ARST自选题库__MPLS多选【25道题】

1.下列描述中关于MPLS网络中配置静态LSP正确的是 当某一台LSR为Egress LSR时&#xff0c;1仅需配置In Label&#xff0c;范围为16~1023 当某一台LSR为Transit LSR时&#xff0c;需要同时配置In Label和Out label&#xff0c;In Label范围为16~1023&#xff0c;0utLabel范围为…

Swift 构造过程

构造过程 一、存储属性的初始赋值1、构造器2、默认属性值 二、自定义构造过程1、形参的构造过程2、形参命名和实参标签3、不带实参标签的构造器形参4、可选属性类型5、构造过程中常量属性的赋值 三、默认构造器结构体的逐一成员构造器 四、值类型的构造器代理五、类的继承和构造…

Vue——计算属性 computed 与方法 methods 区别探究

文章目录 前言计算属性的由来方法实现 计算属性 同样的效果计算属性缓存 vs 方法 前言 在官方文档中&#xff0c;给出了计算属性的说明与用途&#xff0c;也讲述了计算属性与方法的区别点。本篇博客只做自己的探究记录&#xff0c;以官方文档为准。 vue 计算属性 官方文档 …

接口测试系列(一)-什么是接口测试

接口测试系列 为什么要做这个事情&#xff1f; 对自己过往在接口测试上的经验&#xff0c;写一个小结的系列文章&#xff0c;是一个系统性的思考和知识构建。发布的同时&#xff0c;也是希望获得更多感兴趣的同学的意见和反馈&#xff0c;可以把这个部分做的更好。 系列入口&…

夏日采摘季,视频智能监控管理方案助力智慧果园管理新体验

5月正值我国各地西瓜、杨梅、大樱桃、油桃等水果丰收的季节&#xff0c;许多地方都举办了采摘旅游活动&#xff0c;吸引了众多游客前来体验采摘乐趣。随着采摘的人流量增多&#xff0c;果园的管理工作也面临压力。 为了提升水果园采摘活动的管理效果&#xff0c;减少人工巡查成…

nodejs版本管理切换工具nvm介绍、nvm下载、nvm安装、配置及nvm使用

最近很多同学问&#xff0c;在工作中&#xff0c;同时在进行2个或者多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;进而不同项目必须依赖不同版本的NodeJS运行环境&#xff0c;这种情况下&#xff0c;对于维护多个版本的node将会是一件非常麻烦的事情&#xff…

SQL刷题笔记day6-1

1从不订购的客户 分析&#xff1a;从不订购&#xff0c;就是购买订单没有记录&#xff0c;not in 我的代码&#xff1a; select c.name as Customers from Customers c where c.id not in (select o.customerId from Orders o) 2 部门工资最高的员工 分析&#xff1a;每个部…

vue+elemntui 加减表单框功能样式

<el-form ref"form" :model"form" :rules"rules" label-width"80px"><el-form-item label"配置时间" prop"currentAllocationDate"><div v-for"(item,key) in timeList"><el-date…

高并发项目-用户登录基本功能

文章目录 1.数据库表设计1.IDEA连接数据库2.修改application.yml中数据库的名称为seckill3.IDEA创建数据库seckill4.创建数据表 seckill_user5.密码加密分析1.传统方式&#xff08;不安全&#xff09;2.改进方式&#xff08;两次加密加盐&#xff09; 2.密码加密功能实现1.pom.…

CI/CD(基于ESP-IDF)

主要参考资料 B站乐鑫信息科技《【乐鑫全球开发者大会】DevCon23 #15 &#xff5c;通过 CI/CD 进行流水线开发》 pytest-embedded乐鑫文档: https://docs.espressif.com/projects/pytest-embedded/en/latest/api.html 目录 CI/CD简介乐鑫内部CI/CD测试GitLab CI/CDGitHub Actio…

LabVIEW中实现Trio控制器的以太网通讯

在LabVIEW中实现与Trio控制器的以太网通讯&#xff0c;可以通过使用TCP/IP协议来完成。这种方法包括配置Trio控制器的网络设置、使用LabVIEW中的TCP/IP函数库进行数据传输和接收&#xff0c;以及处理通讯中的错误和数据解析。本文将详细说明实现步骤&#xff0c;包括配置、编程…

SheetJS V0.17.5 导入 Excel 异常修复 Invalid HTML:could not find<table>

导入 Excel 提示错误&#xff1a;Invalid HTML:could not find<table> 检查源代码 发现 table 属性有回车符 Overview: https://docs.sheetjs.com/docs/ Source: https://git.sheetjs.com/sheetjs/sheetjs/issues The public-facing websites of SheetJS: sheetjs.com…