【史上最强Java面试题系列】如何保证消息队列的高可用?


10297697-20339d4cc7f23f57

面试问题

如何确保消息队列高度可用?

如果有人问你MQ,那么高可用性是必须的。如前一讲中所述,MQ可能导致系统可用性降低。因此,只要您使用MQ,接下来要问的一些要点肯定是如何解决MQ的缺点。

如果你以愚蠢的方式使用MQ,从未考虑过各种问题,那么你就会有一个杯子,而面试官会觉得你只是简单地使用某种技术而不经过深思熟虑就会给你留下深刻的印象。不是很好。如果这样的同学招募,如果在20k工资范围内的普通弟弟仍然没事,如果工资是20k +,那将是悲惨的,让你设计一个系统,这必须是一堆坑,事故公司会受到影响失利,球队一起回到了底池。

这个问题非常好,因为你不能问你Kafka的高可用性如何得到保证?如何确保ActiveMQ的高可用性?如果面试官问这个问题,那似乎是非常不专业的。人们可能会使用RabbitMQ。没有用过卡夫卡。你上来问某人卡夫卡吗?这不是为了澄清殉难。

所以有一个级别的面试官,MQ的高可用性的保证是什么?这是您使用的MQ,您将谈论您对该MQ的高可用性的理解。

RabbitMQ更具代表性。因为它基于主从(非分布式)以实现高可用性,所以我们将使用RabbitMQ作为示例来解释如何实现第一个MQ的高可用性。

RabbitMQ有三种模式:独立模式,普通集群模式和镜像集群模式。

独立模式,即演示级别,通常是您开始在本地播放的模式

没有人生产独立模式。

普通集群模式意味着在多台机器上启动多个RabbitMQ实例,每台机器一台。您创建的队列只会放在RabbitMQ实例上,但每个实例都会同步队列的元数据(元数据可以视为队列的某些配置信息,通过元数据,您可以找到队列的实例)。当您使用时,如果您实际连接到另一个实例,那么该实例将从队列实例中提取数据。

10297697-59155edb24e70b28

这种方法真的很麻烦,不是很好,不是那么分散,是一个常见的集群。因为这会导致消费者随机连接实例然后拉取数据,或者连接到消耗队列的实例,前者有数据拉动的开销,后者导致单实例性能瓶颈。

如果队列的实例已关闭,则会导致从该实例中提取其他实例。如果启用消息持久性并让RabbitMQ存储消息,则消息不会丢失。你必须等待这个实例。在您可以继续从此队列中提取数据之前还原。

所以这个东西很尴尬,没有高可用性这样的东西,这个程序主要是为了提高吞吐量,就是让集群中的多个节点服务于队列的读写操作。

此模式是RabbitMQ的所谓高可用性模式。与正常群集模式不同,在镜像群集模式下,无论元数据或队列中的消息如何,您创建的队列都将存在于多个实例上,即每个RabbitMQ节点都具有完整版本的队列。镜像,其中包含队列的所有数据的含义。然后,每次向队列写入消息时,它都会自动将消息同步到多个实例的队列。

10297697-95bcf8e25c194150

那么如何打开这种镜像集群模式呢?实际上,它非常简单。 RabbitMQ有一个很好的管理控制台,即在后台添加新策略。此策略是镜像群集模式策略。它可以指定在指定时间对所有节点的数据同步,也可以将其同步到指定的数量。该节点在再次创建队列时,应用此策略将自动将数据同步到其他节点。

在这种情况下,优点是您的任何一台机器都关闭,没有什么,其他机器(节点)也包含此队列的完整数据,其他消费者可以转到其他节点来使用数据。缺点是,首先,这种性能开销太大,消息需要同步到所有机器,导致网络带宽压力和消耗非常沉重!其次,这不是分布式的,没有可扩展性。如果队列负载很重,则添加计算机。新机器还包含队列的所有数据,并且无法线性扩展。你的队列。您认为,如果此队列中的数据量太大而无法容纳此计算机上的容量,我现在该怎么办?

Kafka是一个基本的架构理解:由多个代理组成,每个代理都是一个节点;你创建一个主题,这个主题可以分为多个分区,每个分区可以存在于不同的代理上,每个分区都放一些数据。

这是自然分布式消息队列,这意味着主题数据分布在多台机器上,每台机器都放置一部分数据。

实际上,RabbmitMQ不是一个分布式消息队列,它是一个传统的消息队列,但它提供了一些集群,HA(高可用性)机制,因为无论你如何玩,RabbitMQ都是一个队列。数据放在镜像集群下的节点中,每个节点放置队列的完整数据。

之前的Kafka 0.8,没有HA机制,也就是说,任何代理都是down,代理上的分区被废除,无法写入且无法读取,没有高可用性。

例如,假设我们在三台计算机上创建了一个主题并指定其分区号为3。但是,如果第二台机器出现故障,将导致本主题中1/3的数据丢失,因此无法使用。

10297697-9fa2d375f5d58a66

在Kafka 0.8之后,提供了HA机制,副本复制机制。每个分区的数据都与其他计算机同步,以形成自己的副本副本。所有复制品都选择领导者,因此生产和消费与领导者打交道,其他复制品是粉丝。在写作时,领导者将负责将数据同步到所有粉丝,并在阅读时直接读取领导者的数据。只有读写领导?简单地说,如果您可以随意读写每个关注者,则需要关注数据的一致性。系统的复杂性太高,很容易出错。 Kafka将在不同的机器上均匀分配分区的所有副本,以提高容错能力。

10297697-61adb7cedc7109a6

通过这种方式,存在所谓的高可用性,因为如果代理发生故障,那么该代理上的分区在其他机器上具有副本。如果其上有分区的领导者,那么将从跟随者中重新选出新的领导者。继续阅读。写下新的领导者。这称为高可用性。

在编写数据时,生产者编写领导者,然后领导者将数据写入本地磁盘,然后其他关注者自己从领导者那里提取数据。一旦所有关注者同步了数据,就会向领导者发送一个确认。在领导者收到所有粉丝的ack之后,它会向生产者返回成功的写入消息。 (当然,这只是其中一种模式,您可以根据需要调整此行为)

当您使用时,您只能从领导者那里阅读,但只有当所有粉丝成功地将消息返回到确认消息时,消费者才会阅读该消息。

看到这一点,我相信您对Kafka如何保证高可用性机制有一个大致的了解,对吧?不要无知,现场还可以为面试官画画。如果面试官确实是卡夫卡大师,并深入挖掘问题,那么你只能说尴尬,太深,你没有研究过。

欢迎工作1到5年的Java工程师加入Java架构与QQ群进行沟通:

该小组提供免费的学习指南结构材料和免费答案。如果您不知道这些问题,可以在这个小组中相互交流

此外,还将有一些高级架构师录制的录像:Spring,MyBatis,Netty源代码分析,高并发,高性能,分布式,微服务架构原则,JVM性能优化,这些成为架构师的必备信息

10297697-8adfcd79e2941e90.jpg