Kafak的高可用、消息可靠性以及消息顺序消费

本秂侑毒 提交于 2021-02-07 06:37:26

Kafak是如何实现高可用:

1.zk部署2n+1个节点,形成zk集群,保证高可用。

2.Kafak Broker部署集群,每一个Kafak节点就是一个Broker。每个Topic的partition,基于副本机制,在broker集群中复制。形成replica副本,保证消息存储的可靠性。每个Replica副本都会选出一个leader分区(Partition),提供给客户端进行读写。

3.Kafak Producer无需考虑集群,因为和业务服务器部署在一起。Producer从zk拉取到Topic的元数据,选择对应的Partiton的leader分区,进行消息写入。

       而Borker根据producer的request.acquire.acks配置,判断是写入自己成功就响应producer成功还是写入所有broker(broker上的partition)成功在响应。

4.Kafak Consumer集群部署   每个Consumer分配对应的Topic partition,根据对应的分配策略。并且Consumer从leader分区拉取消息,另外当有consmuer加入或者减少,都会将Topic partition再均衡,重新分配给Consumer。

消息可靠保证

1.消费端的保证消息可靠   取消自动确认,消费完成调用ack,同时做好消息处理冥等处理。

        唯一可能导致消息丢失的情况,在消费端获取到了消息,自动提交了offset,让borker以为已经消费好了这个消息,实际上才开始准备消费这条消息,可能存在消费过程中消费者挂了,这条消息就会丢掉。这和Rabbit差不多,Kafak会自动提交offset,那么只要关闭自动提交offset,处理完成之后手动提交ack。就可以保证消息不丢失。可能消费完了,提交ack过程发生失败,在消费端做好幂等性处理。

2.Borker弄丢了数据

       比较常见的一个场景,某个broker挂了,然后重新选举Partition的leader。此时其他follower刚好有数据没有同步,结果此时leader挂了,然后选举某个follower成为leader之后,这样就导致有些数据丢失了。 

       要设置4个参数:

       1.给Topic设置replication.factor参数:这个值必须大于1,要求每个partition至少有2个副本。

       2.在Kafak服务端设置min.insync.replicas参数:这个值必须大于1,这个要求leader至少感知到至少一个follower还跟自己保持联系

       3.在producer端设置acks=all:这个要求每条数据,必须写入所有的replicas,才能确认写入成功。

       4.在producer端设置retries=MAX,这个要求一旦写入失败,就无限重试。 

3.生产者producer保证消息不丢失

       按照上述思路设置了acks=all,一定不会消失。要求是消息写入了leader后,所有的follower都同步到了消息才确认。如果不满足这个条件,生产者就会不断的重试。

Kafak如何保证消息的顺序消费

kafak本身不像Rocket一样,提供顺序性的消息。所以提供的方案都是相对有损的。这里的顺序消息,我们更多指的是,单个partition的消息,被顺序消费

方式一:Consumer,对每个parttion内部单线程消费,单线程吞吐量太低,一般不会用。

方式二:Consumer拉取到message,写到N个内存queue,具有相同key的数据都存到同一个内存queue。然后对于n个线程,每个线程分别消费一个内存queue即可,这样能保证顺序性。

如何快速的处理故障引发的大量积压数据:

1.恢复当前的consumer程序,然后将consumer都停掉。

2.创建一个topic,parition是原来的十倍。或者临时建立好原来的10倍,20倍的queue数量。

3.然后写一个临时分发数据的consumer一个,这个consumer用来消费原来积压的数据,把数据写入临时建立的10倍的queue。

4.准备临时临时部署10倍的consumer,消费临时queue的数据。 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!