Rabbit MQ消息队列原理

RABBIT_MQ消息队列 发送消息的基础是:boot程序中需要提前定义好队列与交换机,并且绑定,并且监听队列,最终的结果是要靠监听队列的监听结果显示的。对于一个场景来说,将一条消息发送给多个消费者,交换机是用的同一个主题交换机,只需要通过路由键控制分发给不同的队列即可。发送消息是一个动态的过程,主要关注 交换机和路由键 ,可以手动发出一条消息,也可以由程序自动发出一条消息。三种消息以三种不同的规则发送到同一个交换机上,接收消息的监听者需要与发送消息的队列名称一样才能监听到。配置类,四个交换机,一个主题,四种绑定的方式。 阅读详情

一,MQ的三大特性与缺点

异步: 同步是发出一个调用请求之后,在没有得到结果之前,就不返回,调用者主动等待这个调用结果。异步通信不需要客户端等待,可以减少客户端性能消耗,大大地提升用户的体验。例如A系统向B,C,D三个系统发送消息,如果其中一个失败,那么导致整个逻辑失败。(火车退票为例,增库存,支付接口,系统API通知)
解耦: 降低系统的耦合性,(耦合的意思是模块间的紧密联系,修改一个模块,多个模块都需要修改)A->B,B->C,C->D
削峰: 电商系统中,有一个瞬间流量达到峰值的情况,普通服务器无法支撑百万或者千万级别的并发量。MQ可以先把所有的流量承接下来。

上面说了引入消息队列的一些场景和优点,那么使用消息队列有什么缺点呢?

系统的可用性降低:比如第一个例子,本来好好的调用三个接口,这个时候接入一个消息队列,凑巧消息队列挂掉了,系统不是直接不能用了,崩溃掉了。

系统的复杂性:加入一个消息队列,若是消息丢失怎么办,消息被重复消费了,消息没有按找既定的顺序消费,都会导致系统出问题。

一致性问题:A系统处理完了直接返回成功了,那么用户就以为成功了,实际上,BC消费成功了,D消费失败了,数据就不一致了。

二、RabbitMQ的核心模块与流程

在这里插入图片描述
生产者发送消息

1,消息生产者连接到RabbitMQ Broker,建立链接(Connection,在链接(Connection)上开启一个信道(Channel2,声明一个交换机(Exchange,并设置相关属性,比如交换机类型、是否持久化等
3,声明一个队列(Queue),并设置相关属性,比如是否排他、是否持久化、是否自动删除等
4,使用路由键(RoutingKey)将队列(Queue)和交换机(Exchange)绑定起来
5,生产者发送消息至 RabbitMQ Broker,其中包含路由键、交换器等信息,根据路由键(RoutingKey)发送消息到交换机(Exchange6,相应的交换器(Exchange)根据接收到的路由键(RoutingKey)查找相匹配的队列如果找到 ,则将从生产者发送过来的消息存入相应的队列中
7,如果没有找到 ,则根据生产者配置的属性选择丢弃还是回退给生产者
8,关闭信道(Channel9,关闭链接(Connection

消费者生产消息

1,建立链接(Connection2,在链接(Connection)上开启一个信道(Channel3,请求消费指定队列(Queue)的消息,并设置回调函数(onMessage)
4,[MQ]将消息推送给消费者,消费者接收消息
5,消费者发送消息确定(Ack[acknowledge]6,[MQ]删除被确认的消息
7,关闭信道(Channel8,关闭链接(Connection

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
生产者(Producer):发送消息的应用。
消费者(Consumer):接收消息的应用。
队列(Queue):存储消息的缓存。
消息(Message):由生产者通过RabbitMQ发送给消费者的信息。
连接(Connection):连接RabbitMQ和应用服务器的TCP连接。
通道(Channel):连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
绑定(Binding):绑定是队列和交换机的一个关联连接。
路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。

三,消息到底是Broker推送给消费者的?还是消费者主动获取的?消费者消费消息有两种模式。

一种是Pull模式,对应的方法是basicGet。消息存放在服务端,只有消费者主动获取才能拿到消息。如果每搁一段时间获取一次消息,消息的实时性会降低。但是好处是可以根据自己的消费能力决定消息的频率。
另一种是push,对应的方法是BasicConsume,只要生产者发消息到服务器,就马上推送给消费者,消息保存客户端,实时性很高,如果消费不过来有可能会造成消息积压。Spring AMQP是push方式,通过事件机制对队列进行监听,只要有消息到达队列,就会触发消费消息的方法。
RabbitMQ中pull和push都有实现,kafka和RocketMQ只有pull。

四,交换机的Exchange路由方式

4.1 Direct 直连类型 (点对点)
routing key与binding key是一一对应的
一个队列与直连类型的交换机绑定,需指定一个明确的绑定建(binding key)。
生产者发送消息时恢携带一个路由键(routing key)
当消息的路由键与某个队列的绑定建完全匹配时,这条消息才会从交换机路由到这个队列上。多个队列也可以使用相同的绑定建。
在这里插入图片描述
直连类型的交换机,适用于一些业务用途明确的消息。

4.2 Topic 主题
一个routing key对应多个符合规则binding key
一个队列与主题烈性的交换机绑定时,可以在绑定键中使用通配符。支持两个通配符:
#代表0个或者多个单词
*代表不多不少一个单词
单词(Word)指的是用英文的"."隔开的字符,例如:a.bc.def是3个单词。

主题烈性的交换机适用于一些根据业务主题或者消息等级过滤消息的场景,比如说一条消息可能既跟资金有关,又跟风控有关,那就可以让这个消息制定一个多级的路由键。第一个单词代表跟资金相关,第二个单词代表跟风控相关,下游的业务系统的队列就可以使用不同的绑定键去接受消息了。

4.3 Fanout 广播
这种情况下不需要分析锁接受到的Routing key
广播类型的交换机与队列绑定时,不需要制定绑定键,因此生产者发送消息到广播类型交互机上,也不需要携带路由键。消息到达交换机时,所有与之绑定了的队列,都会受到相同的消息的副本。

五,实现订单延迟关闭

业务场景:超过30分钟未付款的订单自动关闭,这个功能应该怎么实现?
RabbitMQ本身不支持延迟投递,总的来说有2种实现方案:
1,先存储到数据库,用定时任务扫描
(定时任务比较容易实现,比如每搁1分钟扫描一次,查出30分钟之前未付款的订单,把状态改为关闭。但是如果数据量过大,比如:10万条,把这些全部的数据查询到内存中逐条处理,也会给服务器带来很大的压力,影响正常的业务运行)
2,利用RabbitMQ的死信队列(Dead Letter Queue)实现
(借助RabbitMQ消息的特性),
(1)队列有一个消息过期属性,这个属性叫x-messge-ttl,所有队列中的消息超过时间未被消费时,都会过期。TTL(Time To Li

消息队列原理 熟悉MQ原理,方便MQ选型 阅读详情

相关推荐

Rabbit MQ详解

RabbitMQ

wlq_567的博客 4891

RabbitMQ教程(安装与使用详解,Spring集成)

RabbitMQ教程,面试题。消息队列(MQ),本质是个队列队列中存放的内容是message。MQ用于不同进程Process/线程Thread之间通信。本文介绍RabbitMQ的使用。RabbitMQ实战教程。

鸟哥哥的专栏 51万+

springboot 集成rabbit mq消息队列

上一篇讲了如何在Mac上安装rabbit mq,现在在springboot框架下使用rabbit mq,初次尝试消息队列的使用。 1.消息队列的基础概念 MQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。我们可以将它理解成邮局,发送者将消息传递到邮局,然后由邮局帮我们发送给具体的消息接收者(消费者),具体发送过程与时间我们无需关心,它也不会干扰我进行其它事情。常见的MQ有...

weixin_42151222的博客 710

mysql消息队列原理_高并发架构系列:MQ消息队列的12点核心原理总结

消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等,总结分享出来,希望大家在使用消息队列技术的时候能够快速理解。1. 消息生产者、消息者、队列 消息生产者Producer:发送消息到消息...

weixin_39664010的博客 559

rabbitmq消息队列原理

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

明耀的博客 2043

Rabbit MQ 死信队列讲解的比较好的

https://www.cnblogs.com/mfrank/p/11184929.html

荒野漂客博客 224

RabbitMQ消息队列原理与应用】

RabbitMQ消息队列原理与应用 一、消息队列概述 (一)概念 消息队列(Message Queue,简称MQ)是一种应用程序间的通信方式,它允许应用程序通过将消息放入队列中,而不是直接调用其他应用程序的接口,实现应用程序间的解耦。发送消息的应用程序称为生产者(Producer),接收消息的应用程序称为消费者(Consumer),消息在队列(Queue)中暂存,直到被消费者消费。 (二)作用 1. 解耦 在分布式系统中,不同服务之间可能存在复杂的依赖关系,使用消息队列可以将这些服务解耦。例如,在一个

架构师之路 1199

Rabbit Mq 底层原理

为什么要用MQ? 1、异步通信:通过异步通信,可以减少接口调用返回时间 2、系统解耦:对于串行访问,可以变为并行 3、流量削峰:对于瞬时访问增大,缓解服务器压力,同时保证消息不丢失 使用MQ带来的问题? 1、系统可用性降低了(因为mq需要部署在服务器,如果服务器出问题,系统可用性降低了) 2、系统变复杂了(需要了解mq实现原来,才能较好的使用mq,...

5122

MQ——Rabbit面试问题

RabbitMQ高级级消息队列协议。是一种的跨进程的通信的机制,用于上下游之间的管道方式的传递的消息。RabbitMQ的作用是本来系统运行好好的,现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性会降低;加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大。A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;

庄小焱 6642

Rabbit MQ

2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。RabbitMQ是由erlang开发的AMQP(Advanced Message Queue 高级消息队列协议)的开源实现,由erlang语言的高并发特性,性能较好,本质是个队列,FIFO先入先出,里面存放的内容是messageRabbitMQ是一个消息中间件:它接受并转发消息。

g474928663的博客 633

Rabbit MQ入门及消息分发机制

一、消息队列简介 1.1 什么是 MQ 消息队列,又叫做消息中间件。是只用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下拓展进程的通信。 1.2 为什么要使用 MQ 1.2.1 异步 同步通信:发出一个调用请求之后,在没有得到结果之前,就不返回。由调用者主动等待这个调用的结果。 异步通信:调用在发出之后,这个调用就直接返回了,所以没有返回结果。也就是说,当一个异步过程调用发出后,调用者不会马上得到结果。而是在调用发出后

weixin_43281498的博客 2633

Spring Boot整合Rabbit MQ消息队列(一)

综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息,而消息队列就是在消息的传输过程中保存消息的容器,你可以简单的把消息队列理解为类似快递柜,快递员(消息发布者)往快递柜(消息队列)投递物件(消息),接受者(消息订阅者)从快递柜(消息队列)接收物件(消息),当然消息队列往往还包含一些特定的消息传递和接收机制。 消息队列作为分布式系统中重

qq_40193787的博客 6万+

消息队列MQ图文总结

https://mikechen.cc/7319.html 消息队列MQ是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要了。 下面我就将通过图文并茂的方式对消息队列MQ来完整详解,认真看完不仅能助你快速掌握消息队列 MQ 最内核的东西,同时还能弄明白消息队列MQ的主流应用场景?主流产品与选型?以及设计一个消息队列MQ该如何下手? ——不啰嗦了,下面进入正文!嘀嘀!准备上车了!!—— 目录 消息队列MQ概述 消息队列MQ应用场景 消息队列MQ

yygr的博客 449

Rabbit MQ消息中间件

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

qq_55682798的博客 1129

RabbitMQMQ的基本概念、RabbitMQ简介及安装

本文涉及MQ的基本概念、RabbitMQ简介、RabbitMQ的安装等内容

十八岁讨厌编程的博客 2万+

rabbit MQ 基础

什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常 见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不 用依赖其他服务。 MQ有什么作用 1.流量消峰 2.应用解耦 3.异步处理 rabbitMq RabbitMQ 是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要

weixin_44990295的博客 287

Rabbit MQ实战

消息队列是一种应用之间的通信方式,消息发送后可以立即返回,由消息系统保证消息的可靠传递。可以用于分布式的削峰限流,通过异步解耦,可以实现分布式事务

zhj52666的博客 722
上一篇: 并发编程关键字 解释比较好的大全
下一篇: Spring Cloud Ribbon源码分析(一)
 丘山一郎
博客等级 码龄8年 345粉丝 272原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值