微信小程序/Java/Appkafka

mq如何保证高可用,解决重复消费、数据丢失问题和顺序性问题

2019-03-01  本文已影响0人  玄冰0825

一、如何保证消息队列的高可用

1. RabbitMQ的高可用性

rabbitmq有三种模式:单机模式,普通集群模式,镜像集群模式

2. kafka的高可用性

kafka架构:多个broker组成,每个broker是一个节点;创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。

它是一个分布式消息队列,就是说一个topic的数据,是分散放在多个机器上的,每个机器就放一部分数据。


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


kafka 0.8以后,提供了HA机制,就是replica副本机制。每个partition的数据都会同步到吉他机器上,形成自己的多个replica副本。然后所有replica会选举一个leader出来,那么生产和消费都跟这个leader打交道,然后其他replica就是follower。写的时候,leader会负责把数据同步到所有follower上去,读的时候就直接读leader上数据即可。kafka会均匀的将一个partition的所有replica分布在不同的机器上,从而提高容错性。

如果某个broker宕机了也没事,它上面的partition在其他机器上都有副本的,如果这上面有某个partition的leader,那么此时会重新选举一个新的leader出来,大家继续读写那个新的leader即可。这就有所谓的高可用性了。


写数据的时候,生产者就写leader,然后leader将数据落地写本地磁盘,接着其他follower自己主动从leader来pull数据。一旦所有follower同步好数据了,就会发送ack给leader,leader收到所有follower的ack之后,就会返回写成功的消息给生产者。

消费的时候,只会从leader去读,但是只有当消息已经被所有follower都同步成功返回ack的时候,这个消息才会被消费者读到。

二、如何保证消息不被重复消费

kafka重复消费的情况:
kafka有个offset的概念,就是每个消息写进去,都有一个offset,代表他的序号,然后consumer消费了数据之后,每隔一段时间,会把自己消费过的消息的offset提交一下,下次重启时,从上次消费到的offset来继续消费。但是offset没来得及提交就重启,这部分会再次消费一次。


怎么保证消息队列消费的幂等性:

三、如何保证消息的可靠性传输(如何处理消息丢失的问题)

丢数据,mq一般分为两种,要么是mq自己弄丢了,要么是我们消费的时候弄丢了

1. rabbitmq
2. kafka

三、如何保证消息的顺序性

1. rabbitmq

拆分多个queue,每个queue一个consumer,就是多一些queue而已,确实是麻烦点;或者就一个queue但是对应一个consumer,然后这个consumer内部用内存队列做排队,然后分发给底层不同的worker来处理

2. kafka

写入一个partition中的数据一定是有序的,生产者在写的时候 ,可以指定一个key,比如指定订单id作为key,这个订单相关数据一定会被分发到一个partition中去。消费者从partition中取出数据的时候也一定是有序的,把每个数据放入对应的一个内存队列,一个partition中有几条相关数据就用几个内存队列,消费者开启多个线程,每个线程处理一个内存队列。

上一篇 下一篇

猜你喜欢

热点阅读