Kafka系列 - 可靠性如何保障&&多线程消费

kafka可靠性如何保障

怎样可以确保Kafka 完全可靠?怎么样做可以确保消息不丢失了?笔者认为:就可靠性本身而言,它并不是一个可以用简单的“是”或“否”来衡量的一个指标,而一般是采用几个9来衡量的。

分别从broker,生产者,消费者三端去深入剖析kafka的可靠性是如何保证的。

Broker

  • 控制器模式,有一个broker会充当控制器,控制器的选举通过zk来完成。
  • 副本策略,一个主题下会有多个分区,每个分区内会有多个副本,一个leader副本,多个follower副本,follower副本负责从leader副本拉取消息。一个leader副本和多个保持进度的副本会构成一个ISR集群,假如ISR集群中的leader副本宕机后,会在ISR中选举一个follower副本充当leader副本,这里的牵扯到数据丢失的问题。使用HW LEO,以及leader epoch来解决数据丢失问题。具体见上篇博客。
  • 刷盘模式,在broker端还有两个参数log.flush.interval.messages和log.flush.interval.ms,用来调整同步刷盘的策略,默认是不做控制而交由操作系统本身来进行处理。同步刷盘是增强一个组件可靠性的有效方式。
  • 参数配置,副本数> min.insync.replicas,副本数要大于最小的同步副本数。
  • 参数配置,unclan.leader.election.enable 默认为false,true代表允许从非isr集合中选举。如果配置成true,可能会造成数据不一致或者数据丢失。毕竟非isr

消费者端

  • 消费者端对位移的控制,最好使用手动提交位移,enable.auto.commit这个改为false。

生产者

  • 生产者发送消息,采用同步模式,或者异步模式,如果使用异步模式最好监听异步回调。对于发送失败的情况,可以通过重试发送或者对外抛出异常。

  • 参数配置,acks=-1或者acks=all,这种配置代表需要ISR中所有副本写入成功才算成功。但是吞吐量会有所下降。

  • 参数配置,客户端内部本身提供了重试机制来应对网络异常,通过 retries 参数即可配置。默认情况下,retries参数设置为0,即不进行重试,对于高可靠性要求的场景,需要将这个值设置为大于 0 的值,与 retries 参数相关的还有一个retry.backoff.ms参数,它用来设定两次重试之间的时间间隔,以此避免无效的频繁重试。

多线程消费

kafkaConsumer是非线程安全的。基于此,有两种解决方案:

1.消费者程序启动多个线程,每个线程维护专属的 KafkaConsumer 实例,负责完整的消息获取、消息处理流程。

2.消费者程序使用单或多线程获取消息,同时创建多个消费线程执行消息处理逻辑。获取消息的线程可以是一个,也可以是多个,每个线程维护专属的 KafkaConsumer 实例,处理消息则交由特定的线程池来做,从而实现消息获取与消息处理的真正解耦。具体架构如下图所示:

优缺点:

多线程消费的最佳实践

多线程消费常见的两种方案,各有优缺点,比较完备的方案,具体可以参考Spring-Kafka的实现,以及Flink内Kafka-connector的实现。

这里附上,Spring-Kafka的相关资料:

https://zhuanlan.zhihu.com/p/93445381

https://spring.io/projects/spring-kafka#overview

https://docs.spring.io/spring-kafka/docs/2.5.1.RELEASE/reference/html/

后续找时间补上Spring-Kafka在消费者端的具体实现。

总结

  • kafka可靠性通过三个端的各自策略去保证,最重要的还是broker端的副本策略,以及leader epoch协议,这块后续要继续深入研究。
  • 多线程消费方案,常见的有两种方式,最佳实践后续详细参考Spring-Kafka的实现。
  • kafka的研究,目前总体告一段落,后续投入精力去深入探究下Spring-kafka的实现。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值