JAVA面试题大全(十二)

1、RabbitMQ 的使用场景有哪些?

  • 跨系统的异步通信,所有需要异步交互的地方都可以使消息队列
  • 多个应用之间的耦合
  • 应用内的同步变异步
  • 消息驱动的架构
  • 跨局域网,甚至跨城市的通讯

2、RabbitMQ有哪些重要的角色?

RabbitMQ的重要角色主要包括以下几个:

  1. 生产者(Producer):生产者是消息的创建者,它负责创建并发送消息到RabbitMQ的交换机。生产者在发送消息时可以指定消息的Routing Key,以便交换机能够正确地将消息路由到相应的队列。

  2. 消费者(Consumer):消费者是消息的接收方,它订阅一个或多个队列,并从队列中接收消息进行处理。消费者通过信道与RabbitMQ进行通信,获取并处理队列中的消息。

  3. 消息队列(Message Queue):消息队列是一个缓冲区,用于存储待处理的消息。队列按照先进先出的顺序传递消息给消费者。在RabbitMQ中,队列是消息的存放容器,负责保存生产者发送过来的消息,直到被消费者消费。

  4. 交换机(Exchange):交换机是消息的分发中心,它负责接收来自生产者的消息,并根据一定的规则将消息路由到一个或多个队列中。交换机根据生产者指定的Routing Key和自身的类型来决定将消息投递到哪些队列。

  5. 绑定(Binding):绑定是交换机与队列之间的关系,它定义了消息如何从交换机路由到队列。通过绑定,交换机能够知道应该将消息发送到哪些队列。在绑定时可以指定Routing Key,以便交换机根据这个Key来过滤和路由消息。

3、RabbitMQ中 vhost 的作用是什么?

vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 vhost 范围的用户控制。当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 vhost 中)。

4、RabbitMQ有哪些重要的组件?

  • ConnectionFactory(连接管理器):应用程序与RabbitMQ之间建立连接的管理器,程序代码中使用。
  • Chanel(信道):消息推送使用的通道。
  • Exchange(交换器):用于接收、分配消息。
  • Queue(队列):用于存储生产者的消息。
  • RoutingKey(路由键):用于把生产者的数据分配到交换器上。
  • BindingKey(绑定键):用于把交换器的消息绑定到队列上。

5、RabbitMQ怎么保证消息的稳定性?

提供了事务的功能,通过将channel设置为confirm(确认)模式

6、要保证消息持久化成功的条件有哪些?

  • 声明队列必须设置持久化durable设置为true
  • 消息推送投递模式必须设置持久化,deliveryMode设置为2(持久)
  • 消息已经到达持久化交换器
  • 消息已经到达持久化队列

7、RabbitMQ持久化有什么缺点?

缺点是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐量。

可尽量使用ssd硬盘来缓解吞吐量的问题。

8、RabbitMQ对集群节点停止顺序有要求吗?

RabbitMQ 对集群的停止的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。

9、RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?

当RabbitMQ集群中唯一一个磁盘节点崩溃时,会出现以下情况:

  1. 集群状态
    • 集群仍然可以保持运行状态,因为RabbitMQ集群的设计允许在部分节点故障时仍然能够提供服务。然而,由于磁盘节点负责存储集群的元数据、队列、交换器等信息,其崩溃会对集群的某些功能产生影响。
  2. 功能限制
    • 在磁盘节点崩溃后,你将无法在集群中创建新的队列、交换器或绑定。这是因为这些操作需要更新集群的元数据,而元数据通常保存在磁盘节点上。
    • 同样,添加用户、更改权限以及添加或删除集群节点的操作也将受到限制,因为这些操作也依赖于磁盘节点上存储的信息。
  3. 数据持久性
    • 如果崩溃的磁盘节点是负责存储特定队列消息的节点,那么这些队列中的消息可能会丢失,除非这些消息已经在其他内存节点上进行了镜像或备份。
    • RabbitMQ默认不会将整个队列的内容复制到整个集群中,因此,如果某个队列只存在于崩溃的磁盘节点上,那么该队列及其消息将无法恢复。
  4. 恢复与故障转移
    • 在磁盘节点崩溃后,应尽快采取措施恢复该节点或替换为新的磁盘节点,以确保集群的完整性和功能恢复。
    • 根据RabbitMQ的集群配置和策略,可以采取不同的故障转移和恢复策略,如使用镜像队列来减少数据丢失的风险。

综上所述,虽然RabbitMQ集群在磁盘节点崩溃后仍然可以运行,但会面临功能限制和数据丢失的风险。因此,及时恢复磁盘节点或采取适当的备份和恢复策略对于维护集群的稳定性和数据安全性至关重要。

10、RabbitMQ 每个节点是其他节点的完整拷贝吗?为什么?

不是,原因有以下两个:

  • 存储空间的考虑:如果每个节点都拥有所有队列的完全拷贝,这样新增节点不但没有新增存储空间,反而增加了更多的冗余数据;
  • 性能的考虑:如果每条消息都需要完整拷贝到每一个集群节点,那新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟。

11、RabbitMQ节点的类型有哪些?

  • 磁盘节点:消息会存储到磁盘
  • 内存节点:消息都存储在内存中,重启服务器消息会丢失,但性能要高于磁盘类型

12、RabbitMQ集群有什么用?

RabbitMQ 集群有以下几个主要用途:

  1. 高可用性:通过在多个节点上运行 RabbitMQ,可以实现高可用性。如果一个节点出现故障,其他节点可以接管工作,确保消息的持续传递,从而减少系统的停机时间。
  2. 可扩展性:可以根据需要动态地向集群中添加或删除节点,以适应不断增长的消息流量。这使得系统能够处理更多的并发连接和消息数量。
  3. 负载均衡:RabbitMQ 集群可以在多个节点之间自动分配消息的负载,确保每个节点都能得到合理的利用,从而提高系统的整体性能。
  4. 数据冗余:可以将队列和消息复制到多个节点上,以实现数据的冗余存储。这增加了数据的可靠性,防止数据丢失。
  5. 故障转移:如果主节点发生故障,RabbitMQ 集群可以自动将队列和消费者转移到其他可用的节点上,确保服务的连续性。
  6. 提高性能:通过在多个节点上分布消息的处理,可以提高系统的吞吐量和响应时间。
  7. 分布式系统:RabbitMQ 集群支持在分布式系统中跨多个节点进行消息传递,使得不同的应用程序或服务可以在不同的节点上运行,并通过消息队列进行通信。
  8. 灵活的部署:可以根据实际需求在不同的服务器上部署 RabbitMQ 节点,形成一个集群,以适应不同的环境和架构。

总之,RabbitMQ 集群提供了一种可靠、可扩展和高性能的消息传递解决方案,适用于各种需要异步通信和分布式系统的场景。它有助于提高系统的可用性、性能和灵活性,确保消息的可靠传递和处理。

相关推荐
Chrikk19 分钟前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*21 分钟前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue22 分钟前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man24 分钟前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟25 分钟前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity1 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天1 小时前
java的threadlocal为何内存泄漏
java
caridle2 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
萧鼎2 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸2 小时前
【一些关于Python的信息和帮助】
开发语言·python