MQ常见面试题
MQ重复消费的问题
1.首先产生mq重复消费的问题的原因
1.1 首先假如生产者生产数据,生产的数据都有一个offset标号,代表这个数据消费的顺序的序号
1.2 例如生产者生产了三条消息152,153,154,这时发送到mq,
1.3 mq按照顺序将数据提交到消费者
1.4 消费者是定时将消费的数据记录提交到zookeeper zk中记录了现在消费到第几条数据,告诉mq
1.5 如果此时消费了152,153消费者重启了,那么记录没提交到zk,此时mq以为消费者才消费到151,还会重新提交152,153
1.6 此时数据就出现了重复的问题,数据库就出现了脏数据
2.如何解决mq的重复消费问题
2.1 重复消费的问题会导致数据库出现脏数据,我们一般通过保证幂等性来解决这个问题
2.2 幂等性是什么。一次和多次请求某一个资源对于资源本身应该具有同样的结果。如何保证生产者重复消费数据保证幂等性
2.3 有多种方式实现。最简单的在插入数据库的数据加个唯一健,这样你插入相同的数据的时候只会保错,不会出现脏数据
2.4 在redis中存个id,每次操作数据之前查下id是否存在。存在的话就不做处理,不存在的话,我们就操作数据库。这样解决幂等性问题
如何保证rabbitmq的高可用性? rabbitmq的高可用是基于主从来做高可用的, 它的模式有三种:单机模式,普通集群模式,镜像集群模式。 1)单机模式 就是普通的demo级别,一般就是你本地启动了玩玩儿,没人生产用单机模式 2)普通集群模式 有多个rabbitmq实体,每个机器启动一个,但是你创建的queue,只会放在一个rabbitmq的实例上,但是每个实例都会从这个queue上去同步数据。问题是当这个queue所在的实例挂了的话就会尴尬了 如果你开启了消息持久化,让rabbitmq落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个queue拉取数据。其实吧这就没有什么高可用可言了。 3)镜像集群模式 这种模式,才是rabbitmq上的高可用模式,你创建的queue无论元数据还是queue中的数据都是保存在多个实例上的(每个节点上都会有这个queue的一个完整的镜像),然后每次你写消息到queue的时候,都会自动将消息在多个实例的queue里进行消息同步。但是这个还是有缺点的,一就是性能开销太大了,消息同步到所有机器的话,导致网络带宽压力和消耗很重,你加机器,新增的机器也会包含这个queue里的所有数据。并没有办法线性拓展你的queue。 任何一个节点宕机的话,没问题,其他节点上还包含这个queue的完整的数据,别的consumer都可以到其他的节点上去消费数据。
开启镜像集群的话,就是在rabbitmq的管理控制台,新增一个策略,这个策略就是镜像集群模式的策略。指定的时候可以要求数据同步到所有节点的,也可以要求就同步的指定数量的节点,然后你再次创建queue的时候,应用这个策略。就会自动将数据同步到其他的节点上去。
|