RabbitMQ知识点

  1. 什么是 rabbitmq

    1. 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦
  2. 为什么要使用 rabbitmq

    1. 在分布式系统下具备异步,削峰,负载均衡等一系列高级功能
    2. 拥有持久化的机制,进程消息,队列中的信息也可以保存下来
    3. 实现消费者和生产者之间的解耦
    4. 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作
    5. 可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单
  3. 使用 rabbitmq 的场景

    1. 服务间异步通信
    2. 顺序消费
    3. 定时任务
    4. 请求削峰
  4. 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?

    1. 发送方确认模式
      1. 将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID
      2. 一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID)。
      3. 如果 RabbitMQ 发生内部错误从而导致消息丢失,会发送一条 nack(notacknowledged,未确认)消息
      4. 发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。
    2. 接收方确认机制
      1. 消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ 才能安全地把消息从队列中删除
      2. 这里并没有用到超时机制,RabbitMQ 仅通过 Consumer 的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ 给了 Consumer 足够长的时间来处理消息。保证数据的最终一致性
      3. 如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ 会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
      4. 如果消费者接收到消息却没有确认消息,连接也未断开,则 RabbitMQ 认为该消费者繁忙,将不会给该消费者分发更多的消息
  5. 如何避免消息重复投递或重复消费

    1. 在消息生产时,MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列
    2. 在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付 ID、订单 ID、帖子 ID 等)作为去重的依据,避免同一条消息被重复消费
  6. 消息基于什么传输

    1. 由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的虚拟连接,且每条 TCP 连接上的信道数量没有限制。
  7. 消息如何分发

    1. 若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。
    2. 通过路由可实现多消费的功能
  8. 消息怎么路由

    1. 消息提供方->路由->一至多个队列
    2. 消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定
    3. 通过队列路由键,可以把队列绑定到交换器上
    4. 消息到达交换器后,RabbitMQ 会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)
  9. 常用的交换器主要分为一下三种

    1. fanout:如果交换器收到消息,将会广播到所有绑定的队列上
    2. direct:如果路由键完全匹配,消息就被投递到相应的队列
    3. topic:可以使来自不同源头的消息能够到达同一个队列。 使用 topic 交换器时,可以使用通配符
  10. 如何确保消息不丢失

    1. 消息持久化,当然前提是队列必须持久化
    2. RabbitMQ 确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit 会在消息提交到日志文件后才发送响应。
    3. 一旦消费者从持久队列中消费了一条持久化消息,RabbitMQ 会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前 RabbitMQ 重启,那么 Rabbit 会自动重建交换器和队列(以及绑定),并重新发布持久化日志文件中的消息到合适的队列
  11. 使用 RabbitMQ 有什么好处?

    1. 服务间高度解耦
    2. 异步通信性能高
    3. 流量削峰
  12. RabbitMQ 的集群

    1. 镜像集群模式
      1. 创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,然后每次你写消息到 queue 的时候,都会自动把消息到多个实例的 queue 里进行消息同步。
      2. 好处在于,任何一个机器宕机了,别的机器都可以用。
      3. 坏处在于,第一,这个性能开销太大,消息同步所有机器,导致网络带宽压力和消耗很重!
      4. 第二,这样就没有扩展性可言了,如果某个 queue 负载很重,你加机器,新增的机器也包含了这个 queue 的所有数据,并没有办法线性扩展你的 queue
  13. mq 的缺点

    1. 系统可用性降低
      1. 系统引入的外部依赖越多,越容易挂掉,本来是 A 系统调用 BCD 三个系统的接口就好了, ABCD 四个系统好好的,没问题,加个 MQ 进来,万一MQ 挂了,整套系统崩溃了
    2. 系统复杂性提高
      1. 加个 MQ 进来,需要保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?
    3. 一致性问题
      1. A 系统处理完了直接返回成功了,以为这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,数据就不一致了

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

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

相关文章

Java集合基础知识点复习

目录 Java提供的常见集合ListArrayList底层实现与扩容机制ArrayList listnew ArrayList(10)中的list扩容几次如何实现数组和List之间的转换用Arrays.asList转List后,如果修改了数组内容,list受影响吗?List用toArray转数组后,如果修…

Vue 【vite使用alias】

文章目录 前言一、vite.config.ts二、tsconfig.json三、可能遇到的问题 前言 这是一个比较常用,且配置简单的功能。但是在不同环境下还是有点点小坑,这边就当是一个全面的记录吧。 vite中配置alias总共需要配置两个地方 vite.config.ts:让代…

Java基础知识总结(44)

(1)分支结构——Switchcase 语法: switch(expression){ case 1: //代码 break; case 2: //代码 break; ... default: } Java7之前 expression的类型只支持byte、short、int、charJava7之后添加了String和枚举switch分支语句的执行是先对expre…

【STL】链表(list)

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个…

uniapp项目问题及解决(前后端互联)

1.路由跳转的问题 uni.navigateTo() 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面 uni.redirectTo() 关闭当前页面,跳转到应用内的某个页面。 uni.reLaunch&…

MySQL-复杂SQL语句编写:子查询分析与练习

子查询 1. 由一个具体的需求&#xff0c;引入子查询2. 称谓的规范&#xff1a;外查询&#xff08;或主查询&#xff09;、内查询&#xff08;或子查询&#xff09;3. 子查询的分类4. 单行子查询4.1 单行操作符&#xff1a; ! > > < <4.2 子查询中的空值问题4.3 非…

揭开Spring Bean生命周期的神秘面纱

目录 一、Spring IOC 1.1 Spring IOC 的加载过程 二、Spring Bean 生命周期 2.1 实例化前置 2.2 实例化后置 2.3 属性赋值 2.4 初始化前置 2.5 初始化 2.6 初始化后置 2.7 Bean 销毁 Spring 是一个开源的企业级Java应用程序框架&#xff0c;它简化了企业级应用程序开…

开源数据湖iceberg, hudi ,delta lake, paimon对比分析

Iceberg, Hudi, Delta Lake和Paimon都是用于大数据湖(Data Lake)或数据仓库(Data Warehouse)中数据管理和处理的工具或框架,但它们在设计、功能和适用场景上有所不同。 Iceberg: Iceberg是用于大型分析表的高性能格式。Iceberg将SQL表的可靠性和简易性带入到大数据领域,同…

【java的本地锁到分布式锁介绍】

文章目录 1.java本地自带锁介绍及应用synchronized&#xff08;1&#xff09;synchronized原理和优化&#xff08;2&#xff09;synchronized作用&#xff08;3&#xff09;synchronized的使用 CAS(1) CAS原理&#xff08;2&#xff09;CAS和synchronized优缺点 lock 2.分布式锁…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;先二分查找行&#xff0c;再二分查找列。解题思路二&#xff1a;暴力遍历&#xff0c;也能过。解题思路三&#xff1a;用python的in。 题目描述&#xff1a; 给你一个满足下述两条…

VSCODE目录树缩进调整

VSCode默认的缩进太小了&#xff0c;简直看不出来&#xff0c;很容易弄混目录。在设置里修改就行了。 修改后效果&#xff1a;

何为网络协议?一图知晓网络过程。

网络协议就是计算机之间沟通的语言 为了有效地交流&#xff0c;计算机之间需要一种共同的规则或协议&#xff0c; 就像我们和老外沟通之前&#xff0c;要先商量好用哪种语言&#xff0c; 要么大家都说中文&#xff0c;要么大家都说英语&#xff0c;这才能有效地沟通。 网络协…

04-springmvc-RequestContextHolder

一、获取request对象的四种方法 方法1、Controller中加参数来获取request 注意&#xff1a;只能在Controller中加入request参数。 一般&#xff0c;我们在Controller中加参数获取HttpServletRequest&#xff0c;如下所示&#xff1a; RestController RequestMapping("…

OSPF中配置静态路由负载分担实验简述

OSPF中配置静态路由负载分担 实验简述 在静态路由负载分担中&#xff0c;多个路由器被配置为共享负载的目标&#xff0c;以实现流量的均衡分配。 到达目的地有N条相同度量值的路径&#xff0c;默认值60&#xff0c;N条路由是等价路由&#xff0c;数据报文在N条链路上轮流发送。…

速盾:cdn原服务器地理位置

CDN&#xff08;Content Delivery Network&#xff09;是一种通过在不同地理位置部署服务器的技术&#xff0c;旨在提高网站的访问速度和稳定性。它将原始服务器内容复制到多个节点服务器中&#xff0c;这些节点服务器分布在全球各个地理位置&#xff0c;并根据用户的地理位置和…

使用iPhone/安卓手机代替门禁卡

文章目录 基础知识ID卡和IC卡ID卡技术IC卡技术IC卡加密方式手机NFC只能模拟IC卡&#xff0c;而不支持ID卡电梯卡可能使用滚动码验证方式&#xff0c;不支持使用手机模拟 &#xff08;IC类型&#xff09;门禁卡验证方式仅验证ID&#xff08;卡号&#xff09;验证ID分区信息 iPho…

【云开发笔记NO.28】数据中台的概述

数据中台的定义 在云开发中&#xff0c;数据中台是一个综合性的数据管理和服务平台&#xff0c;它集成了数据管理、数据治理、数据服务等多个功能&#xff0c;并基于云计算技术架构而建立。数据中台的核心目标是为企业提供稳定、高效、安全的数据支持和服务&#xff0c;进而推…

探索基于WebRTC的有感录屏技术开发流程

title: 探索基于WebRTC的有感录屏技术开发流程 date: 2024/4/7 18:21:56 updated: 2024/4/7 18:21:56 tags: WebRTC录屏技术屏幕捕获有感录屏MediaStream实时传输音频录制 第一章&#xff1a;技术原理 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种开放源…

Python中的 if __name__ == ‘__main__‘

一、if name ‘main’ 在Python的世界里&#xff0c;if name ‘main’:这行代码就像是派对的入口&#xff0c;它决定了哪些部分是只在当前这个“派对”&#xff08;或者说脚本&#xff09;中直接执行的&#xff0c;哪些部分是可以被其他“派对”&#xff08;或脚本&#xff…