后端学习 - RabbitMQ

文章目录

  • 一 MQ 的作用与基本概念
    • 1 流量削峰
    • 2 应用解耦
    • 3 异步调用
    • 4 四个基本概念
  • 二 核心模式
    • 1 工作队列模式(Work Queue)
    • 2 发布/订阅模式(Publish / Subscribe)
    • 3 路由模式(Routing)
    • 4 主题模式(Topic)
  • 三 RabbitMQ 消息机制
    • 1 消息应答 & 重新入队
    • 2 预取值
    • 3 持久化
    • 4 发布确认
    • 5 保证消息的幂等的两种方式
  • 四 交换机
    • 1 Fanout
    • 2 Direct
    • 3 Topic

一 MQ 的作用与基本概念

  • 消息队列的主要功能:流量削峰、应用解耦、异步处理

1 流量削峰

  • 先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务压垮
    在这里插入图片描述

2 应用解耦

  • 生产者(客户端)发送消息到消息队列中去,接受者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,这显然也提高了系统的扩展性

3 异步调用

  • 将用户的请求数据存储到消息队列之后就立即返回结果,随后系统再对消息进行消费
  • 是流量削峰的基础
  • 使用消息队列进行异步处理之后,需要适当修改业务流程进行配合。比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,再通知用户订单成功,以免交易纠纷
    在这里插入图片描述

4 四个基本概念

生产者:产生数据、发送消息的程序
交换机:接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息(推送到特定队列 / 推送到多个队列 / 丢弃等)
队列:队列是 RabbitMQ 内部使用的一种数据结构,本质上是一个大的消息缓冲区
消费者:大多时候是一个等待接收消息的程序
在这里插入图片描述


二 核心模式

1 工作队列模式(Work Queue)

在这里插入图片描述

  • 消费者间是竞争关系,每个消息只被消费一次
  • 主要思想是避免立即执行资源密集型任务,把任务封装为消息并将其发送到队列
  • 默认采用轮询方式向消费者发送消息,也可以根据消费者的处理能力指定不公平分发

2 发布/订阅模式(Publish / Subscribe)

在这里插入图片描述

  • 生产者将消息放入交换机,交换机把消息发送到和该交换机绑定的所有消息队列中
  • 消费者之间是资源共享的
  • 使用的交换机类型为 Fanout

3 路由模式(Routing)

在这里插入图片描述

  • 使用的交换机类型为 Direct
  • binding key 是交换机绑定到队列的 key,例如图中的 orange、black、green
  • routing key 是消息携带的 key,交换机将消息路由到和 binding key 匹配的队列中

4 主题模式(Topic)

在这里插入图片描述

  • 使用的交换机类型为 Topic,在路由模式的 routingKey 的基础上添加了通配符,实现了模糊匹配

三 RabbitMQ 消息机制

1 消息应答 & 重新入队

  • 分为自动和手动,自动应答指的是,消息发送后立即被认为已经传送成功,容易发生消息丢失
  • 手动应答的回答方式:ACK(处理成功) / NACK(处理失败) / REJECT(拒绝处理)
  • 手动应答的好处是可以批量应答(批量指应答 channel 上未应答的消息),并且减少网络拥堵
  • 如果消费者由于某些原因失去连接(其通道已关闭,连接已关闭或 TCP 连接丢失),导致消息未发送 ACK 确认,RabbitMQ 将获取到消息未完全处理,并对其重新排队

2 预取值

  • 对于每个消费者来说,都有一个存放未处理消息的缓冲区。“预取计数”值定义了通道上允许的未确认消息的最大数量,限制缓冲区的大小,以避免缓冲区里面无限制的未确认消息问题
  • 通常增加预取计数值,将提高向消费者传递消息的速度
  • 据此可以解释,虽然自动应答传输消息速率是最佳的,但在这种情况下已传递但尚未处理的消息的数量也会增加

3 持久化

  • 默认情况下 RabbitMQ 退出或由于某种原因崩溃时,忽视队列和消息。确保消息不会丢失需要将队列和消息都标记为持久化
  • 持久化并不能完全保证不会丢失消息,还需要配合发布确认

4 发布确认

  • 队列持久化 + 消息持久化 + 发布确认 = 消息不丢失
  • 生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,RabbitMQ 就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了(如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出
  • 三种发布确认方式的对比
类型工作方式特点
单个发布确认一次发布一个消息,只有它被确认发布,后续的消息才能继续发布发布速度特别慢;同步(阻塞消息的发布)
批量发布确认一次发布一批消息,一起确认当发布出现问题时无法定位问题消息,必须将整个批处理保存在内存中,以记录重要的信息而后重新发布消息;同步(阻塞消息的发布)
异步发布确认生产者只需发送消息而不用等待确认,RabbitMQ 收到某个消息,调用 ackCallBack 向生产者确认已收到消息,未收到调用 nackCallBack需要哈希表记录消息序号和消息内容;可靠性和效率最高;异步(不阻塞消息的发布)

在这里插入图片描述

5 保证消息的幂等的两种方式

幂等:用户对于同一操作发起的一次请求或者多次请求的结果是一致的

  • 唯一ID + 指纹码作为数据库主键,利用数据库主键去重

    1. 根据消息生成一个全局唯一的ID,然后加上一个指纹码,保障这次操作是绝对唯一的
    2. 将ID + 指纹码拼接好的值作为数据库主键,在消费消息前,先从数据库查询这条消息的指纹码标识是否存在,没有就执行 insert 操作,如果有就代表已经被消费
  • 利用 Redis 的原子性

    1. 在接收到消息后,将消息ID作为 key 执行 setnx 命令
    2. 如果执行成功就表示没有处理过这条消息,执行失败表示消息已经被消费

(类似于分布式锁的实现)


四 交换机

  • 生产者只能将消息发送到交换机,交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息
  • 交换机类型:直接(direct),主题(topic),标题(headers) ,扇出(fanout)
  • 通过绑定(binding),实现交换机和队列关系的建立

1 Fanout

  • 将接收到的所有消息广播到它绑定的所有队列中

2 Direct

  • Direct 交换机只把消息发送到具有一致 routingKey 队列中去,要求生产者在向 MQ 发送消息时指定 routingKey

  • 如果发送的消息的 routingKey 不对应任何一个队列,则丢弃该消息

  • 一个 Direct 绑定的多个队列可以指定相同的 routingKey(类似 Fanout)
    在这里插入图片描述

  • 一个队列可以指定多个 routingKey
    在这里插入图片描述

3 Topic

  • 通俗来讲,在 Direct 模式上,队列指定的 routingKey 增加了通配符
  • 队列指定的 routingKey 必须是一个单词列表,以点号分隔开
  • *可以代替一个单词,#可以替代零个或多个单词
    在这里插入图片描述

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

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

相关文章

dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇

简介: Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构。重启开源后,我们不仅看到 Dubbo 3.0 最新的 Roadmap 发布,而且还看到阿里在自身电商开始推进 Dubbo 和内部 HSF 的融合,并在 双11 …

初识ABP vNext(12):模块的独立运行与托管

点击上方蓝字"小黑在哪里"关注我吧模块运行动态 C# API 客户端前言很久没更新这个系列。。。之前的章节中讲到ABP的模块是可以独立运行的,但是没有介绍具体怎么操作,本篇就来讨论一下模块如何独立运行,以及一些托管方式。本人也是处…

后端学习 - Spring5

文章目录一 简介二 IOC1 底层原理2 实现过程3 Spring 实现 IOC 的两个接口二 Bean1 普通 Bean 与 FactoryBean2 Bean 单例与否的设置3 Bean 的生命周期三 IOC 的 Bean 管理(XML)1 创建对象2 属性注入 - 使用 set 方法3 属性注入 - 通过有参构造器实现3 注…

吐槽一下Abp的用户和租户管理模块

1. 背景ASP.NET Core 基于声明的访问控制到底是什么鬼?聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息。-----------ClaimB站:438962688 Name:饭思思_weibo:538210234 Name:饭思思van姓名:不详 籍贯…

后端学习 - JDBC

文章目录一 JDBC概述1 Java中的数据存储技术2 什么是JDBC3 JDBC程序的编写步骤二 Java连接数据库的方式三 使用 PreparedStatement 实现 CRUD 操作1 数据库的调用的三个接口2 增Create/删Delete/改Update 操作3 查Retrieval操作4 批量插入操作四 数据库事务1 事务2 事务的 ACID…

后端学习 - JavaWeb

技术体系 文章目录一 HTML1 网页的组成部分2 HTML 概述3 HTML 标签4 常用标签5 表单与表单的提交二 CSS1 语法格式2 使用方法三 JavaScript1 概述2 与 HTML 结合的两种方式3 变量类型及特殊值4 关系、逻辑运算5 数组6 函数7 事件8 DOM (Document Object Model&#…

心想技术驱动业务,却在背道而驰

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「165」篇原创敬上大家好,我是Z哥。相信每一位真正的程序员心里都有这样一个念想:只要我的技术够牛,就能驱动业务的发展。但是往…

后端学习 - SpringMVC

文章目录一 SpringMVC 简介1 MVC2 SpringMVC3 创建第一个 SpringMVC 项目二 RequestMapping1 注解类与方法的区别2 value 属性3 method 属性4 params 属性5 headers 属性6 SpringMVC 支持路径中的占位符三 获取 Request 的一系列参数1 通过控制器方法的形参2 控制器方法形参 映…

hbase shell远程连接_hbase与phoenix集成

Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问Phoenix会将用户编写的sql查询编译为一系列的scan操作,最终产生通用的JDBC结果集返回给客户端Phoenix可以看成是mysql准备安装包apache-phoenix-4.…

对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相

一:背景1. 讲故事昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为:[C#.NET 拾遗补漏]10:理解 volatile 关键字 (https://www.cnblogs.com/willick/p/13889006.html) 的文章,大概就是说在 多线程环境下,一个在debu…

后端学习 - SpringBoot

SpringBoot 是整合 Spring 技术栈的一站式框架,是简化 Spring 技术栈的快速开发脚手架约定大于配置 文章目录一 概述1 第一个 SpringBoot 项目2 SpringBoot 特性:依赖管理3 SpringBoot 特性:自动配置二 SpringBoot 的 IOC容器1 组件添加&…

centos rpm 安装 perl_Linux【常用软件安装篇】

摘要:本文介绍Linux常用的软件安装方式以及jdk、vim、mysql、tomcat、redis的安装过程。1 Linux常用软件安装方式常用方式有:rmp包安装、yum指令安装、源码包安装、解压免安装。1.1 rpm包安装rpm是Red-Hat Package Manager(RPM软件包管理器&a…

日计不足涓滴成河-自定义响应结果格式化器

什么是响应结果响应结果就是,在客户端向服务器发出请求后,服务器根据客户端的请求参数,给出的结果,这就是一个完整的响应结果过程。响应的结果包含的内容非常多,主要的有 HTTP Status Code,Content-Type,Co…

docker 容器启动顺序_Docker容器启动时初始化Mysql数据库

1. 前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行。那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案。 第一种方案是在容器启动后手动导入,太low了不行。第二…

后端学习 - JVM(上)内存与垃圾回收

JVM 架构图 文章目录一 JVM 简介二 类加载子系统:1 作用2 类的三个加载过程3 类加载器的分类4 双亲委派机制 & Tomcat为何不遵循5 两个 class 对象为同一个类的必要条件三 运行时数据区:PC寄存器(Program Counter Register)四…

SM2 国密算法被 Linux 内核社区接受

喜欢就关注我们吧!10 月 25 日,有开发者发文称,SM2 国密算法终于被 Linux 内核社区接受了。该作者表示,SM2 的补丁已经更新到了 v7 版本,这个版本的补丁最终被社区接受,目前已经合并到了 Linux 主线的 5.10…

后端学习 - MyBatis

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的 持久层框架 文章目录一 基于配置文件的 MyBatis 搭建1 搭建过程(增删改)2 查询操作3 特殊操作二 MyBatis 获取参数值的方式1 单个字面量类型的参数2 多个字面量类型的参数3 Map 类型的参数4 实体…

国产操作系统发展离不开人才和市场

日前,中国 1024 程序员节盛大举行,一大批开源大咖齐聚千年岳麓,围绕开源标准、生态、人才发展等主题分享,共议开源软件与操作系统未来。其中,统信软件总经理刘闻欢表示,“有了市场才会被真正的用起来”&…

后端学习 - Redis

文章目录一 Redis 概述Redis 为什么是单线程,单线程为什么这么快?数据存储结构二 常用数据类型1 String2 HashHash 的扩容机制:渐进式 rehash*3 List4 Set5 Zset三 Redis 事务1 乐观锁与 watch 命令2 事务的三个特性四 Redis 持久化1 RDB(Red…

再被补刀!Flash又遭抛弃,你会怀念它吗?

喜欢就关注我们吧!微软近日发布通知,称更新了关于 Adobe Flash Player 的删除。微软更新目录站点可下载更新 KB4577586,用于删除 Flash Player。此更新适用于所有受支持的操作系统版本。重要版本 Windows 10 和 Windows 8.1 的可选更新也将在…