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

Kafak是如何实现高可用:

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

2.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即可,这样能保证顺序性。

 

转载于:https://my.oschina.net/u/3126880/blog/3063535

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值