关于mq的几件小事如何保证消息队列的高可用

jack1995 jack1995     2022-12-12     527

关键词:

1.RabbitMQ的高可用

RabbitMQ基于主从模式实现高可用。RabbitMQ有三种模式:单机模式,普通集群模式,镜像集群模式。
(1)单机模式:
单机模式就是demo级别的,生产中不会有人使用。
(2)普通集群模式
普通集群模式就是在多台机器上启动多个rabbitmq实例,每个机器启动一个。但是创建的queue只会放在一个rabbitmq实例上面,但是其他的实例都同步了这个queue的元数据。在你消费的时候,如果连接到了另一个实例,他会从拥有queue的那个实例获取消息然后再返回给你。
技术图片
这种方式并没有做到所谓消息的高可用,就是个普通的集群,这样还会导致要么消费者每次随机连接一个实例然后拉取数据,这样的话在实例之间会产生网络传输,增加系统开销,要么固定连接那个queue所在的实例消费,这样会导致单实例的性能瓶颈。

而且如果那个方queue的实例宕机了,会导致接下来其他实例都无法拉取数据;如果没有开启消息的持久化会丢失消息;就算开启了消息的持久化,消息不一定会丢,但是也要等这个实例恢复了,才可以继续拉取数据。
所以这个并没有提供高可用,这种方案只是提高了吞吐量,也就是让集群中多个节点来服务某个queue的读写操作。
(3)镜像集群模式
这种模式,才是rabbitmq提供是真正的高可用模式,跟普通集群不一样的是,你创建的queue,无论元数据还是queue里面是消息数据都存在多个实例当中,然后每次写消息到queue的时候,都会自动把消息到多个queue里进行消息同步。
技术图片
这种模式的好处在于,任何一台机器宕机了,其他的机器还可以使用。
坏处在于:1、性能消耗太大,所有机器都要进行消息的同步,导致网络压力和消耗很大。2、没有扩展性可言,如果有一个queue负载很重,就算加了机器,新增的机器还是包含了这个queue的所有数据,并没有办法扩展queue。
如何开启镜像集群模式:在控制台新增一个镜像集群模式的策略,指定的时候可以要求数据同步到所有节点,也可以要求同步到指定节点,然后在创建queue的时候,应用这个策略,就会自动将数据同步到其他的节点上面去了。

2.kafka的高可用

(1)kafka的一个基本架构:多个broker组成,一个broker是一个节点;你创建一个topic,这个topic可以划分成多个partition,每个partition可以存在于不同的broker上面,每个partition存放一部分数据。这是天然的分布式消息队列。

实际上rabbitmq并不是分布式消息队列,他就是传统的消息队列,只不过提供了一些集群、HA的机制而已,因为无论如何配置,rabbitmq一个queue的数据就存放在一个节点里面,镜像集群下,也是每个节点都放这个queue的全部数据。

kafka在0.8以前是没有HA机制的,也就是说任何一个broker宕机了,那个broker上的partition就丢了,没法读也没法写,没有什么高可用可言。

kafka在0.8之后,提过了HA机制,也就是replica副本机制。每个partition的数据都会同步到其他机器上,形成自己的replica副本。然后所有的replica副本会选举一个leader出来,那么生产者消费者都和这个leader打交道,其他的replica就是follower。写的时候,leader会把数据同步到所有follower上面去,读的时候直接从leader上面读取即可。
为什么只能读写leader:因为要是你可以随意去读写每个follower,那么就要关心数据一致性问题,系统复杂度太高,容易出问题。kafka会均匀度讲一个partition的所有数据replica分布在不同的机器上,这样就可以提高容错性。
这样就是高可用了,因为如果某个broker宕机 了,没事儿,那个broker的partition在其他机器上有副本,如果这上面有某个partition的leader,那么此时会重新选举出一个现代leader出来,继续读写这个新的leader即可。
技术图片
写消息: 写数据的时候,生产者就写leader,然后leader将数据落到磁盘上之后,接着其他follower自己主动从leader来pull数据。一旦所有follower同步好了数据,就会发送ack个leader,leader收到了所有的follower的ack之后,就会返回写成功的消息给消息生产者。(这只是一种模式,可以调整)。
读数据:消费数据的时候,只会从leader进行消费。但是只有一个消息已经被所有follower都同步成功返回ack的时候,这个消息才会被消费者读到。

上一篇《消息队列的用途、优缺点、技术选型
下一篇《[如何保证消息不重复消费]((https://www.cnblogs.com/jack1995/p/10908805.html)》

关于mq的几件小事如何保证消息不重复消费

1.幂等性幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复... 查看详情

关于mq的几件小事消息队列的用途优缺点技术选型

1.为什么使用消息队列?(1)解耦:可以在多个系统之间进行解耦,将原本通过网络之间的调用的方式改为使用MQ进行消息的异步通讯,只要该操作不是需要同步的,就可以改为使用MQ进行不同系统之间的联系,这样项目之间不... 查看详情

关于mq的几件小事消息积压在消息队列里怎么办

1.大量消息在mq里积压了几个小时了还没解决场景:几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上很晚,10点多,11点多。线上故障了,这个时候要不然就是修复consumer的问题,让他恢复消费速度,然后傻傻... 查看详情

关于mq的几件小事如果让你设计一个mq,你怎么设计

其实回答这类问题,说白了,起码不求你看过那技术的源码,起码你大概知道那个技术的基本原理,核心组成部分,基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好比如说这个消息队列系统,我们... 查看详情

关于redis的几件小事redis的并发竞争问题

1.什么是并发竞争就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了。或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。2.怎么解决采用分布式锁+数据修改... 查看详情

mq系列11:如何保证消息可靠性传输(除夕奉上)

...息队列的高可用保障MQ系列9:高可用架构分析MQ系列10:如何保证消息幂等性消费1介绍这篇我们来说说MQ消息的可靠性传输。可靠性传输其实包含 查看详情

高薪程序员&面试题精讲系列127之如何设计一个消息队列?如何保证消息的执行顺序?

...设计一个消息队列,该怎么实现?2.题目剖析壹哥在前面的几篇文章中,已经把RabbitMQ的很多重难点面试题都给大家讲解完了,比如RabbitMQ的交换机类型,保证MQ的消息可靠性,保证MQ的高可用,集群搭建等问题,这些问题都非常... 查看详情

分布式消息队列--rabbitmq(代码片段)

...高系统稳定性2.劣势引入MQ提高了系统复杂度,需考虑如何保证消息不被丢失的情况引入MQ降低了系统可用性,需考虑如何保证MQ的高可用常见MQ对比RabbitMQRabbitMQ是一款基于AMQP协议(高级消息 查看详情

关于redis的几件小事redis的持久化

1.redis持久化的意义redis持久化的意义,在于故障恢复。如果没有对数据进行持久化,那么如果redis遇到灾难性的故障,就会丢失所有的数据。如果通过redis的持久化机制将数据持久化到硬盘上面去,然后在定期将磁盘上的文件备... 查看详情

消息队列的面试题2

 问题:    如何保证消息队列的高可用啊? RabbitMQ是比较有代表性的,因为是基于主从做高可用性的,我们就以他为例子讲解第一种MQ的高可用性怎么实现。 rabbitmq有三种模式:单机模式,普通集群模式... 查看详情

分布式开发之消息队列

...什么使用消息队列?使用消息队列有什么缺点?消息队列如何选型?如何保证消息队列是高可用的?如何保证消息不被重复消费?如何保证消费的可靠性传输? 1.为什么使用消息队列?   解耦,异步,限流 2.使用消... 查看详情

关于springmvc的几件小事(代码片段)

一.SpringMVC表单标签He处理静态资源1.Spring的表单标签通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显。1.form标签一般情况下,通过GET请求获取表单页面,而通... 查看详情

关于spring中aop的几件小事(代码片段)

0.AOP简介AOP(Aspect-OrientedProgramming,面向切面编程):是一种新的方法论,是穿透OOP的补充。AOP的主要编程对象是切面(aspect),而切面模块化横切关注点。在使用AOP编程时,仍然需要定义功能功能,但可以明确的定义这个功能在哪里,... 查看详情

六消息队列复习

...置,选举leader,以及在ConsumerGroup发生变化时进行rebalance4如何保证消息不被重复消费(幂等性)?  k 查看详情

mq消息队列(代码片段)

...点1.3消息队列的缺点1.4消息队列比对2、RabbitMQ2.1、RabbitMQ如何保证消息不被重复消费2.2、RabbitMQ如何保证消息不丢失2.2.1生产者丢数据2.2.2消息队列丢数据2.2.3消费者丢数据2.3、RabbitMQ如何保证消息有序2.4、RabbitMQ如何处理消息堆积... 查看详情

rabbitmq(代码片段)

...计RabbitMQRabbitMQ是什么RabbitMQ的特点AMQP是什么?RabbitMQ如何保证消息的可靠性?RabbitMQ如何保证队列的高可用?RabbitMQ使用场景高内聚,低耦合rabbitmq 查看详情

分库分布的几件小事数据库如何拆分

1.为什么要分库分表①分库分表说白了,就是因为数据量太大了,如果你的单表数据量都到了千万级别,那么你的数据库就无法承受高并发的要求,数据库操作性能就会出现极大的下降。②数据库并发量太大了,一般而言,一个... 查看详情

mq相关问题

...MQ优缺点优点缺点各种MQ的适用场景activemqrabbitmqrocketmqkafka如何保证MQ高可用?rabbitmq高可用kafka高可用如何保证消息不被重复消费发送的消息丢失rabbitmq的消息丢失kafka的消息丢失如何保证消息的顺序性?MQ相关问题为什么使用MQ解... 查看详情