RabbitMq原理及应用

article/2025/10/22 10:26:17

一、简介

MQ(Message Queue),即消息队列,是一种实现应用级别之间的通信手段。不同应用之间可以通过读写消息,以消息为媒介传递应用数据,不需要应用之间建立强连接。此方式与远程调用(RPC)是应用通信的常见方式。在这个调用过程中,消息发送者定义为生产者,消息接收者为消费者。

RabbitMq是使用Erlang语言开发的基于AMQP协议实现,面向消息、队列、路由的开源消息中间件。在一些企业级应用中对数据一致性、稳定性和可靠性以及吞吐量、性能要求比较高的场景应用比较广泛。

RabbitMq使用链路原理图:

二、RabbitMq原理

RabbitMq相比于其他MQ引入了交换器(Exchange)的概念,生产者将消息发送到Exchange,由Exchange根据调度策略路由到消息队列中,Exchange本身并不存储消息。

  1. Exchange调度策略

    1)Fanout(订阅模式/广播模式)

     

Fanout交换器会把所有该交换器接收到的消息路由到所有与交换器绑定的队列中,与具体的绑定关系无关。类似于广播,在能够接收到声音的范围内都能收听到广播消息,是一对多的关系。

    2)Direct(路由模式)

     

Direct交换器模式要求消息携带的RoutingKey与交换器和队列的BindingKey完全匹配,匹配成功则将消息发送到对应队列,该模式也是RebbitMq的默认模式,有时候我们感觉不需要交换器也可以接收和发送消息,是因为使用了这个默认模式,该模式交换器名字是空字符串,绑定了所有的Queue(BindingKey = 队列名)。     

      3)Topic模式(通配符模式)

      

Topic交换器采用通配符的方式要求消息队列携带的RoutingKey和BindingKey匹配成功才能将消息发送到队列。RoutingKey要求必须是以”.“作为分隔符,”#“能够模糊匹配"."一个分隔符以内的字符,”*“能够匹配多个分隔符以内的字符。

2.消息确认机制

在实际使用过程中,会有消费者宕机未消费消息的情况,RabbitMq的解决方案是ack模式,要求消费者消费完成后向RabbitMq发送一个回执信号,RabbitMq收到这个回执以后将消息从消息队列中移除。如果RabbitMq没有收到这个回执或者消费者与RabbitMq断开连接,则RabbitMq会把消息发送到其他消费者。同时如果RabbitMq一直没有收到回执,队列中的数据会逐渐堆积。相反的,如果返回no-ack回执,每次消费者接收到消息后,RabbitMq不管是否已经消费,立即将该消息标记为已消费,从队列中移除。

3.消息持久化机制

为了防止消息丢失,可以设置RabbitMq队列消息持久化,这样可以保证大部分消息不会丢失。当然在消息还未完全持久化完成的这个过程如果RabbitMq宕机也会使部分未持久化的消息丢失。

3.事务

AMQP协议支持事务,因此RabbitMq也支持事务,RabbitMq宕机造成的数据丢失生产者是无法感知到的,因此对RabbitMq开启事务之后,只有在txCommit()之后才代表消息已经持久化。

4.消息分发机制

RabbitMq可以设置每个消费者固定消费一定数量的消息,可以在RabbitMq服务器界面中看到队列中的消息有没有被消费。

二、应用

  1. 解耦,为面向服务的架构(SOA)提供基本的最终一致性实现

传统模式的RPC调用,上下游系统之间直接调用,如果库存系统宕机,生产者者系统业务操作也会相应失败,即系统之间耦合性太重。

   引入消息队列,生产者系统先将数据写入消息队列,消息队列返回写入成      功,库存系统采用订阅的方式从消息队列中获取消息持久化,即便库存系      统宕机或者异常,消息队列中的消息依旧存在,等系统恢复以后继续消          费,既保持了数据的完整性也保证了系统的最终一致性。

2.提高数据处理效率

  

3.流量削峰

在传统模式中用户请求直接到达数据库的方式可以应对流量较小的情况,一旦用户请求到达一定的数量级,数据库压力过大就会导致宕机。

引入消息队列后

由于MQ能够处理大数据量的特点,用户高并发请求均写入消息队列,消费者可以按照某个固定值从消息队列消费请求,即便消费数据需要一定的时间,但是并且不影响数据的最终一致性。

一、消息队列的优缺点

优点:解耦、效率、削峰

缺点:

1)系统的可用性降低,

引入消息队列以后系统的外部依赖增多,如果MQ挂了之后会导致整个生态崩溃,这个时候可能就要考虑MQ集群等。

2)系统复杂度提高

随着系统复杂度的提高,相应的问题自然就会增多,比如消息会不会重复消费,如何保证消息的完整性,如果保证消息的消费顺序等。

3)一致性问题

如果在整个链路过程中数据丢失,会导致数据的不一致性。

总结,消息队列是一种比较复杂的架构,只有在合适的业务场景中使用才能够做到物尽其用,否则反而造成系统过于臃肿,MQ带来的问题需要额外的考虑技术方案解决,当然,在一些特殊场景,MQ则是最优解。


http://chatgpt.dhexx.cn/article/yK29phTI.shtml

相关文章

RabbitMQ原理解析

场景模拟 在介绍RabbitMQ之前,我们先来看下面一个电商项目的场景: 商品的原始数据保存在数据库中,增删改查都在数据库中完成。搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化&#xff0…

Rabbitmq基本原理和架构

全栈工程师开发手册 (作者:栾鹏) 架构系列文章 rabbitmq官网:https://www.rabbitmq.com/rabbitmqctl.8.html MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,produc…

RabbitMQ — RabbitMQ使用以及原理解析

RabbitMQ使用以及原理解析 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现;在RabbitMQ官网上主要有这样的模块信息, Work queues消息队列,Publish/Subscribe发布订阅服务,Routing, Topics, RPC等主要应用的模块功能. 几个概念说明: Broker:它提供一种传…

RabbitMQ介绍及工作原理

RabbitMQ介绍及工作原理 一,什么是RabbitMQ ​ RabbitMQ是一种称为消息代理或队列管理器的消息队列软件。它是一个可以定义队列的软件,应用程序可以连接到队列并将消息传输到它们。消息队列的基本体系结构很简单:存在称为生产者的客户端应用…

彻底理解RabbitMQ底层原理

1.RabbitMQ概念 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准 ,为 面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息&…

rabbitmq消息队列原理

一、rabbitmq架构 RabbitMQ是一个流行的开源消息队列系统,是AMQP(高级消息队列协议)标准的实现,由以高性能、健壮、可伸缩性出名的Erlang语言开发,并继承了这些优点。rabbitmq简单架构如下: 上图简单展…

SpringBoot整合RabbitMQ及其原理分析

上一篇&#xff1a;RabbitMQ基础知识 1、相关依赖 这里无需指定版本号&#xff0c;让其跟着SpringBoot版本走。本示例使用SpringBoot版本号为2.7.10。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-…

rabbitmq详解

rabbitmq 一、简介二、业务场景1、异步2、应用解耦3、流量削峰 三、下载四、界面认识五、五种模型示例0、springboot依赖配置1、Hello World简单模型2、Work queues工作队列3、Publish/Subscribe发布订阅模型4、Routing路由模型5、Topics主题模型6、消息转换器 六、进阶1、消费…

[RabbitMQ--1] MQ简介

目录 1.MQ 的相关概念 1.1.什么是 MQ&#xff1f; 1.2.为什么要用MQ&#xff1f;MQ的应用场景 1.2.1.流量消峰&#xff1a; 1.2.2.任务异步处理&#xff1a; 1.2.3.应用解耦 2.AMQP和JMS 3.MQ 的分类 1.ActiveMQ 2.Kafka 3..RocketMQ 4..RabbitMQ 4.RabbitMQ 1.四…

什么是RabbitMq?其原理?

什么是RabbitMq&#xff1f; RabbitMQ是一个实现了AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;高级消息队列协议的消息队列服务&#xff0c;用Erlang语言。 rabbitmq原理 1.Producer&#xff1a;即数据的发送方。创建消息并将其发布(发送)到代理服务器 一…

RabbitMQ原理详解

RabbitMQ&#xff1a;我们通常谈到消息队列&#xff0c;就会联想到这其中的三者&#xff1a;生产者、消费者和消息队列&#xff0c;生产者将消息发送到消息队列&#xff0c;消费者从消息队列中获取消息进行处理。对于RabbitMQ&#xff0c;它在此基础上做了一层抽象&#xff0c;…

你应该知道的 9 种 前端设计模式

本篇文章给大家介绍 9 种 前端设计模式。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 什么是设计模式&#xff1f; 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff…

前端需要了解的设计模式

什么是设计模式&#xff1f; 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解…

前端设计模式应用

前端设计模式应用 什么是设计模式 软件设计中常见问题的解决方案模型: 历史经验的总结与特定语言无关 设计模式背景 模式语言:城镇、建筑、建造 (A Pattern Language:Towns, Buildings,Construction)1977设计模式:可复用面向对象软件的基础 (Design Patterns: Elements of …

web端设计和web前端开发的区别

Web前端开发技术主要包括三个要素&#xff1a;HTML、CSS和JavaScript&#xff01; 它要求前端开发工程师不仅要掌握基本的Web前端开发技术&#xff0c;网站性能优化、SEO和服务器端的基础知识&#xff0c;而且要学会运用各种工具进行辅助开发以及理论层面的知识&#xff0c;包括…

前端开发中常用设计模式-总结篇

本文是向大家介绍前端开发中常用的设计模式&#xff0c;它使我们编写的代码更容易被复用&#xff0c;也更容易被人理解&#xff0c;并且保证代码的稳定可靠性。 1.什么是设计模式 通俗来讲&#xff0c;就是日常使用设计的一种惯性思维。 因为对应的这种思维&#xff0c;以及对…

前端的设计模式有哪些呢

谈谈设计模式~ 文章目录 什么是设计模式设计模式分类1. 结构型模式2. 创建型模式3. 行为型模式具体使用 什么是设计模式 设计模式&#xff0c;是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式是指一种思想和方法论&#xff0c;先有设计思想&#xff0c;才能…

【面试】最新web前端经典面试题试题及答案(持续更新)-html/css、js、vue、http、web安全、前端性能、浏览器、js算法

author: aSuncat JavaScript知识点大全&#xff1a;https://www.yuque.com/webfront/js 所有最新最全面试题&#xff0c;持续更新在语雀。见 语雀-前端面试题&#xff0c;欢迎点击关注~ 阅读目录 html/ css&#xff1a;https://blog.csdn.net/aSuncat/article/details/88789368…

为什么说前端一定要学好设计模式?

设计模式&#xff08;Design Pattern&#xff09;大家一定不陌生。通俗地讲&#xff0c;它是前辈们对代码开发经验的总结&#xff0c;让你写出可扩展、可读、可维护的高质量代码&#xff0c;还能让你在遇到相似的问题、场景时&#xff0c;快速找到更优的解决方案。 也许你会说&…

前端JS设计模式

什么是设计模式 软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 比…