当前位置: 首页 > 科技观察

您将如何为消息中间件设计高可用性架构?

时间:2023-03-21 20:40:38 科技观察

1.背景介绍这篇文章,先说说消息中间件高可用架构的一些原理。作为一个合格的高级Java工程师,肯定会遇到系统中使用MQ的场景。这时候就需要根据自己的业务场景和需求,考虑在使用MQ时可能会遇到的一些技术问题。.然后,你要针对这些技术问题设计一个完整的技术方案。你需要从各个角度考虑你的系统和MQ打通后完整的技术方案,比如消息的订阅方式,消息从生产到消费的全链路不丢包,如何保??证高消息中间件本身的可用性。因此,本文将谈谈消息中间件高可用的架构原则。其次,让我们考虑一下消息中间件的可用性。我们抛开各种具体的技术,想一想。MQ的可用性如何?让我们看看下面的图片。其实原因很简单。如果你的MQ部署在一台机器上,那么正常情况下,生产者会发消息给MQ,然后让消费者去获取。但是万一哪天出了什么意外,MQ部署的机器,莫名其妙的原因,MQ自己的进程挂掉了,或者机器直接宕机了,那么这时候怎么办呢?很尴尬是吧,结果很明显,生产者发不出数据,消费者也拿不到数据。那么整个系统就完事了?因为系统的核心进程根本跑不通吧?MQ宕机会直接导致您的系统自身出现故障,进而可能导致您公司对外的APP、网站等产品无法运行,用户无法使用您公司的服务。如果你的公司是电商平台、外卖平台、社交平台。那么如果发生这种情况,公司岂不是损失惨重?如果你的系统几个小时都不能让人用,而你公司的电商平台一天的收入可以达到1亿,但是现在几个小时下不了单,最后一天的收入是5000万,那你公司是不是直接活亏了5000万?这真的不是开玩笑。如果你关注互联网行业的新闻和八卦,你应该知道,近年来一些大型互联网公司也出现过类似情况,损失惨重。是不是?3.集群部署+数据冗余很好,但是问题来了!现在大家觉得一个MQ中间件应该如何实现高可用呢?这里有很多方式,比如数据多副本冗余,集群镜像同步机制,我们抛开具体的技术,从本质层面来思考MQ集群实现高可用的几种方式。我们先来看下图。假设我们写入MQ的数据是冗余多副本的,也就是你写的每条消息都复制到其他机器上。所以此时,任何一台机器宕机似乎都不会影响我们继续与MQ通信,写入的数据似乎还在。上图中,MQ以集群方式部署在两台机器上,然后生产者向其中一台机器写入消息,消息自动同步复制到另一台机器。这时候数据在两台机器上,有两份。如果第一台机器宕机,会影响我们吗?答案是不。因为数据本身是冗余多副本的,此时消费者可以消费第二台机器的消息,生产者可以继续向第二台机器写入消息,不会丢失数据。而且,系统可以在完全不中断进程的情况下继续运行,如下图所示。这种感觉是不是很棒?其实这种MQ集群部署架构和数据多副本冗余机制都是很常见的高可用架构。优秀的消息中间件Kafka就是采用这种架构来保证高可用和数据容错。4.多副本同步复制的强制性要求但是这里你要考虑另外几个问题。第一个是:当你向其中一台机器写入数据时,你是否必须要求那台机器将数据复制到另一台机器?一台机器,保证集群中必须有这个数据的双副本,才算这次写入成功?没错,如果你不能保证这一点,比如你往其中一台机器写数据,他还没来得及复制到另一台机器上,第一台机器就直接宕机了。此时,虽然可以继续基于第二台机器发送和消费消息,但是刚刚发送的消息丢失了。看看下面的图片来理解这个场景。所以在使用这种机制的时候,就得让producer设置一些参数,保证在向某台机器写消息的时候,他必须把消息同步成功到另外一台机器上,并且集群中存在双副本,然后只有这个时候才能认为消息成功。如果一台机器刚写完就死机了,还没来得及复制到另一台机器上,这次写应该会报错失败,然后重试,重新向MQ集群写入数据。看看下面的图片。只要你写成功一次,他就保证数据已经同步成双份了。这时候,即使一台机器宕机,数据也不会丢失,生产和消费可以有条不紊地继续进行。5、多机托管、多副本是必须的。第二个问题,如果你的集群有两台机器,现在其中一台宕机了,只剩下一台机器,你还能让你的生产者继续往唯一的机器上写数据吗?答案是不。因为如果集群中只有一台机器可以处理写入,如果剩下的机器再次宕机怎么办?还会不会造成数据丢失,集群挂掉?因此,您的生产者也应该根据参数进行设置。集群中必须有超过2台机器可以接收您的数据副本。否则,如果只有一台机器可以接受你的数据副本,那就算了。看看下面的图片,感受一下场景。假设集群中有3台机器,其中一台宕机,后面写入另一台机器时,可以判断集群中还剩下两台机器,足以保证高可用和容错数据的双副本。这样就可以继续正常向MQ集群写入数据了。事实上,上面提到的整套机制都可以在Kafka中使用。它有一些相应的参数来配置数据的副本数,包括每次写入必须复制多少台机器才算成功。否则,它会被重新发送,并且你集群中剩余的机器必须能够承载多个副本才能继续写入数据。通过这一整套方案的设计和基于特定技术的实现,可以保证在集群部署的情况下,集群中必须有几台机器承载多份,同时冗余写入数据后必须保证多副本。此时,任何一台机器宕机,数据都不会丢失,系统可以继续正常运行。6.架构原理与技术无关事实上,本文对消息中间件的集群高可用架构的讨论是完全脱离于具体的技术。从本质原则的层面来讨论这个话题是很简单的。RabbitMQ、Kafka、RocketMQ等各种消息中间件在这种高可用架构的实现上有一定的相似性,但也有不同的技术实现和相应的区别。