首页 > 编程语言 >【Java面试】RabbitMQ

【Java面试】RabbitMQ

时间:2025-01-20 22:30:34浏览次数:3  
标签:交换器 Java 队列 RabbitMQ queue 面试 死信 消息

RabbitMQ是什么?

RabbitMQ是一款开源的、基于Erlang语言编写的消息中间件,遵循AMQP协议(Advanced Message Queuing Protocol )。

RabbitMQ核心概念

生产者(Producer):发送消息的一方。

消费者(Consumer):接收消息的一方。

消息队列(Queue):存储消息的容器,消息最终被发送到这里。

交换器(Exchange):负责将消息路由到队列,根据绑定规则转发消息。

绑定(Binding):将交换器和队列关联起来的路由规则。

Broker:RabbitMQ 的服务节点,可以看作一个 RabbitMQ 服务器。

 交换器类型

fanout:广播消息到所有绑定的队列,不关心路由键。

direct:根据路由键完全匹配转发消息。

topic:支持模糊匹配(* 匹配一个单词,# 匹配多个单词)。

headers:根据消息头中的键值对匹配,较少使用。

消息可靠性

生产者到 RabbitMQ

  • 事务机制(tx):效率低,不推荐。

  • Confirm 机制:生产者确认消息是否成功到达 Broker。

RabbitMQ 内部

  • 持久化(durable):将消息存储到磁盘。

  • 集群和镜像队列:保证高可用性。

RabbitMQ 到消费者

  • 消费者确认(basicAck):确保消息被正确消费。

  • 死信队列(DLX):处理未被消费的消息。

什么是死信队列?如何导致的?

DLX,全称为 Dead-Letter-Exchange,死信交换器。当消息在一个队列中变成死信 (dead message) 之后,它能被重新发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。

导致的死信的几种原因

  • 消息被拒(Basic.Reject /Basic.Nack) 且 requeue = false
  • 消息 TTL 过期。
  • 队列满了,无法再添加。

延迟队列

  • 使用 TTL(消息存活时间)和死信交换器(DLX)实现。

  • 插件支持(rabbitmq-delayed-message-exchange)。一般使用这种方式。

如何保证RabbitMQ高可用? 

RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用性的,我们就以 RabbitMQ 为例子讲解第一种 MQ 的高可用性怎么实现。RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。

单机模式

Demo 级别的,一般就是你本地启动了玩玩儿的?,没人生产用单机模式。

普通集群模式

意思就是在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。你创建的 queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据可以认为是 queue 的一些配置信息,通过元数据,可以找到 queue 所在实例)。

你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从 queue 所在实例上拉取数据过来。这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个 queue 的读写操作。

镜像集群模式

这种模式,才是所谓的 RabbitMQ 的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说,每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上。RabbitMQ 有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。

这样的好处在于,你任何一个机器宕机了,没事儿,其它机器(节点)还包含了这个 queue 的完整数据,别的 consumer 都可以到其它节点上去消费数据。坏处在于,第一,这个性能开销也太大了吧,消息需要同步到所有机器上,导致网络带宽压力和消耗很重!RabbitMQ 一个 queue 的数据都是放在一个节点里的,镜像集群下,也是每个节点都放这个 queue 的完整数据。

 

 

 

标签:交换器,Java,队列,RabbitMQ,queue,面试,死信,消息
From: https://blog.csdn.net/m0_75276797/article/details/145249480

相关文章

  • javascript 对象的显示属性和隐式属性
    在JavaScript中,对象的属性可以分为“显示属性”(也称为自有属性,ownproperties)和“隐式属性”(通常指的是继承自原型链上的属性)。理解这两类属性的区别对于深入掌握JavaScript对象模型非常重要。显示属性(OwnProperties)显示属性是指直接定义在一个对象上的属性。它们是该对象......
  • 【Java毕设】基于java的火车订票管理系统设计新版源码+数据库+说明+LW
    一、项目介绍本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述火车订票管理系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系......
  • Java 比较器 (详细现实案例代码拆解)
    前言:小编最近又要练科目三了天天好多事情啊,不知道大家放了假事情多不多我们继续日更!!!我们一直都是以这样的形式,让新手小白轻松理解复杂晦涩的概念,把Java代码拆解的清清楚楚,每一步都知道他是怎么来的,为什么用这串代码关键字,对比同类型的代码,让大家真正看完以后融会贯通......
  • Java基础
    什么是字节码?采用字节码的好处是什么?JVM可以理解的代码就叫做字节码。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计......
  • 深入浅出SpringSecurity,Java程序员必备的!
    前言在Java应用开发领域,安全管理始终是一个不可忽视的重要议题。随着SpringBoot和微服务架构的日益普及,SpringSecurity这一安全框架逐渐成为了众多Java开发者关注的焦点。其之所以能够获得如此青睐,很大程度上得益于微服务架构的兴起。作为Spring生态圈中不可或缺的一员,Sp......
  • Java程序员如何才能精通SpringBoot?
    前言回想当初我们刚开始接触Java,搭建一个Web应用的场景历历在目:1、精心配置web.xml,确保spring和springmvc得以加载。2、细心设置数据库连接,以及spring事务的处理。3、耐心安排配置文件的读取,激活必要的注解。4、繁琐地配置日志文件,以期项目运行平稳。5、一切配置就绪......
  • JavaScript学习(三)
    有事情的缘故导致中间几天没有进行学习。今天开始继续后端的学习,学习的第五天(2025.1.20)JavaScript 函数定义        JavaScript使用关键字 function 定义函数。        函数可以通过声明定义,也可以是一个表达式。        函数声明   ......
  • Java实现DES编码加解密 - 密钥为: Text
    编写工具类publicclassDesPasswordUtil{publicstaticfinalStringWIFI_DES_KEY="TmuhP9PD";/***生成密钥**@return{@linkString}*@throwsException例外*/publicstaticSecretKeySpeccreateKeyFromText(Stri......
  • Java实现DES编码加解密 - 密钥为: Hex
    编写工具类publicclassDesPasswordUtil{publicstaticfinalStringWIFI_DES_KEY="TmuhP9PDtcQ=";/***生成密钥**@return{@linkString}*@throwsException例外*/publicstaticStringgenerateKey()throwsExce......
  • JAVA动态代理
    什么是动态代理  动态代理是一种设计模式,允许开发者在运行时动态地创建实现了一组接口的代理对象。这些代理对象在调用目标对象的方法时,可以在方法调用前后添加自定义的逻辑,而无需修改目标对象的代码。动态代理的核心思想是提供一种灵活的方式来增强或改变原有对象的行为......