【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列

文章目录

  • 【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列
  • 一、消息队列的作用
    • 1.为什么要用消息队列
    • 2.消息队列有什么作用
    • 3.消息队列会带来什么问题
  • 二、主流的消息队列
  • 三、RabbitMQ 基于什么传输消息
  • 四、RabbitMQ 模型架构
  • 五、死信队列和延迟队列
    • 1.死信队列
    • 2.延迟队列

一、消息队列的作用

1.为什么要用消息队列

随着互联网的发展,业务场景也越来越复杂,导致系统之间的耦合度越来越高,开发维护的成本也越来越高。这个时候就需要一个中间件来解耦,这是使用消息队列的主要原因。此外,还有异步和削峰的需求

2.消息队列有什么作用

异步
举一个电商支付的例子,首先肯定会涉及到生成订单,用户消费后会赠送积分,这就涉及到积分发放。还有的时候有促销活动,消费送现金卷,又会涉及到现金卷发放。这样,一个支付流程就至少需要经历生成订单、积分发放和现金卷发放三个步骤,如果采用同步的方式,就会发生阻塞,每增加一个步骤,支付业务的总时长就会相应增加,用户的体验肯定会变差。因此我们需要采用异步的方式,让这几个步骤同时执行,可以大大缩短业务处理的总时长

解耦
虽然使用线程池也可以实现同时执行多个步骤,但是这样就提高了代码之间的耦合度,使得开发维护的成本提高,随着业务扩展,只会越来越难以维护。这就是消息队列的第二个作用,解耦

削峰
最后是削峰,假如一个系统能承载的最大并发请求量是一万,突然有一个时刻来了两万的并发请求,为了防止系统崩溃就可以使用消息队列进行削峰,将两万并发请求路由到消息队列中,消息队列控制同一时段只传输一万的并发量

3.消息队列会带来什么问题

  1. 消息重复投递和消息重复消费
  2. 消息丢失
  3. 消息传递的顺序性
  4. 消息队列可用性

二、主流的消息队列

市场上主流的消息队列有 ActiveMQ、RocketMQ、Kafka 和 RabbitMQ

ActiveMQ 社区活跃度不高,更新太慢。底层原理只是对 JMS 进行了封装,对比其他 MQ 没有明显的性能优势

Kafka 虽然单机吞吐量非常高,但是只支持最基本的消息传递功能,不支持消息查询和回溯,因此一般只应用于大数据开发和日志采集

RocketMQ 的功能非常完备,采用分布式架构,在单机吞吐量和可用性上都有明显的优势,并且是使用 Java 开发的,进行二次开发的难度相对较低

RabbitMQ 是使用 Erlang 开发的,单机吞吐量和可用性不如 RocketMQ,但是 RabbitMQ 消息传递的延迟更低,因此如果对于单机吞吐量和可用性的需求不高的话,使用 RabbitMQ 是个很好的选择

三、RabbitMQ 基于什么传输消息

生产者和消费者都需要与 RabbitMQ 节点建立连接,这个连接就是 TCP 连接。除了 TCP 连接,RabbitMQ 还有信道的概念,每个客户端都和 RabbitMQ 节点间用信道传输,但是实际上使用的都是同一条 TCP 连接,也就是 I/O 多路复用技术。如果每增加一个客户端就建立一条 TCP 连接,必然需要额外耗费系统的性能,如果遇到流量高峰,就会出现性能瓶颈的问题。但是当信道本身的流量很大时,这时多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节

四、RabbitMQ 模型架构

AMQP
RabbitMQ 中的交换器、交换器类型、队列、绑定、路由键等都是遵循的 AMQP 协议中相应的概念,可以这样说,RabbtiMQ 就是 AMQP 协议的 Erlang 的实现

AMQP 本质上是一种应用层的通信协议,可以看作一系列结构化命令的集合,类似于 HTTP 中的 GET、POST 等方法,例如声明一个队列,或者消费一条消息

RabbitMQ 的模型包括生产者、交换器、队列和消费者

从整体上看,RabbitMQ 是一个生产者与消费者模型,负责接收、存储和转发消息。从局部上看,RabbitMQ 更像是一种交换机模型,生产者通过 RabbitMQ 将消息路由到指定队列中,队列再将消息路由到消费者

生产者和消费者不需要过多介绍

交换器

生产者将消息发送到交换器,由交换器路由到一个或多个队列中。交换器有四种类型:

  1. fanout:会将消息路由到所有与该交换器绑定的队列
  2. direct:会将消息路由到路由键和绑定键完全匹配的队列
  3. topic:会将消息路由到路由键和绑定键模式匹配的队列
  4. headers:会获取消息的 headers 属性,然后路由到匹配的队列中

五、死信队列和延迟队列

1.死信队列

当队列中的消息出现以下情形,会变成死信:

  • 消息被拒绝
  • 消息过期
  • 队列达到最大长度

死信会被发往死信交换器,与死信交换器绑定的队列就是死信队列。我们可以通过分析程序来消费死信队列中的消息来分析当时遇到的异常情况,进而改善和优化系统

2.延迟队列

生产者发送消息以后,我们希望消费者等待指定时间后才能拿到这个消息,比如:

  1. 用户下单后 30 分钟内需要支付,如果 30 分钟之内没有支付成功,这个订单将执行异常处理
  2. 智慧家居系统中,用户希望通过手机遥控智能设备在指定时间内工作

实现原理是当生产者生产消息时,为消息设置指定过期时间,当消息过期时就会进入死信队列。此时,消费者订阅的并不是普通的队列,而是与这个普通队列绑定的死信队列,当消息因为过期进入死信队列的时候就会被消费者消费,从而实现了延迟队列

【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列相关推荐

  1. RabbitMq(十二) 借用死信交换机实现延迟队列

    概述:延迟队列即在消息发送后延迟固定时间后再去接受处理,做相应的一些相应. 应用场景举例:在电商购物后,订单支付前发送消息信息,在三分钟之后检查订单是否支付成功,如果支付,则取消订单并库存数量恢复:或 ...

  2. redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池

    参考资料 :分布式中间件实战:java版 (书籍), 多线程视频教程(视频)- 项目启动环境 导入依赖 <parent><groupId>org.springframework ...

  3. 【分布式】Rabbitmq死信队列模型、实战场景---订单延迟30min支付处理

    分布式 内容管理 死信队列 死信队列demo 死信队列消息模型 平台订单支付超时 --- 演示 业务分析 代码实现 RabbitMQ 死信队列/ 延迟队列 - 延迟业务逻辑 最近可能分布式进入Redi ...

  4. 面试官:RabbitMQ本身不支持延迟队列,那你给我实现一个?

    以下文章来源方志朋的博客,回复"666"获面试宝典 RabbitMQ本身没有延迟队列的支持,但是基于其本身的一些特性,可以做到类似延迟队列的效果:基于死信交换器+TTL. 以下介绍 ...

  5. rabbitmq利用死信队列+TTL 实现延迟队列

    2019独角兽企业重金招聘Python工程师标准>>> 适用场景:订单超时未支付,倘若适用定时器的话,那么数据量大的话,轮询查询数据,首先IO开销大,其次任务时间要求高,扫描越频繁性 ...

  6. SpringBoot RabbitMQ 延迟队列代码实现

    场景 用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列 准备 利用rabbitmq_delayed_message_exchange插件: 首先下载该插件:https://ww ...

  7. SpringBoot RabbitMQ 集成 七 延迟队列

    为什么80%的码农都做不了架构师?>>>    何为延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列.而一般的队列,消息一旦入队了之后就会被消费者马上消费. 延迟 ...

  8. RabbitMQ 延迟队列-对于入门来说可以快速上手

    RabbitMQ 延迟队列-非常非常实用 RabbitMQ 延迟队列-非常非常实用 一.使用场景 二.消息延迟推送的实现 三.项目具体实现 RabbitMQ 延迟队列-非常非常实用 一.使用场景 ​ ...

  9. 你真的知道怎么实现一个延迟队列吗 ?

    作者:xiewang,腾讯 IEG 运营开发工程师 前言 延迟队列是我们日常开发过程中,经常接触并需要使用到的一种技术方案.前些时间在开发业务需求时,我也遇到了一个需要使用到延迟消息队列的需求场景,因 ...

最新文章

  1. AprilTag中的apriltag.h文件
  2. jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中
  3. 利用抽象语法树检查Python中“未定义”的变量名
  4. java 解析并生成 XML
  5. SqlServerDBHelper类
  6. 深入理解Scala的隐式转换
  7. python命令提示符后的小白块是什么_Python:响应命令行提示
  8. 找出唯一出现一次的数
  9. C 语言中 bzero()函数的使用
  10. 01背包问题—dp算法(动态规划)—java代码
  11. 5G词汇通俗解释(5G核心网部分)
  12. Quadratic probing
  13. PXE无人值守安装系统
  14. 学习笔记1:搭建floodlight+mininet+sflow环境
  15. LVM中VG PV PP LV的概念
  16. leetcode_592. 分数加减运算
  17. 关于oracle11g下的demobld.sql
  18. mysql5.7.19winx64安装,mysql5.7.19 winx64解压缩版安装配置教程
  19. 2021年青海互助一中高考成绩查询,青海公务员考试网2021年青海省考成绩查询
  20. (附源码)计算机毕业设计SSM基于java的音乐推荐系统

热门文章

  1. fir滤波器课程设计matlab,Matlab课程设计---FIR数字滤波器
  2. Linux的gcc编译器下载,gcc编译器下载
  3. 刷新所有视图存储过程
  4. Sublime Text 3 设置
  5. 网页Object标签 遮盖DIV标签解决方法
  6. 每天一道Java题[4]
  7. return to dl_resolve无需leak内存实现利用
  8. Python之路【第三篇】:Python基础(二)
  9. 【转】ON_MESSAGE使用方法
  10. document.documentElement和document.body的区别