
【真实生产案例】SpringBoot 整合 Kafka 实现数据高吞吐
一、介绍
在上篇文章中,我们详细的介绍了 kafka 的架构模型,在集群环境中,kafka 可以通过设置分区数来加快数据的消费速度。
光知道理论还不行,我们得真真切切的实践起来才行!
下面,我将结合生产环境的真实案例,以SpringBoot
技术框架为基础,向大家介绍 kafka 的使用以及如何实现数据高吞吐!
二、程序实践
最近,公司大数据团队每天凌晨会将客户的订单数据进行统计计算,然后把业绩数据推送给我们,以便销售人员每天能看到昨天的业绩数据,数据的体量大约在 1000 多万条,以下是我对接的过程!
2.1、添加 kafka 依赖包
本次项目的SpringBoot
版本为2.1.5.RELEASE
,依赖的 kafka 的版本为2.2.6.RELEASE
2.2、添加 kafka 配置变量
当添加完了依赖包之后,我们只需要在application.properties
中添加 kafka 配置变量,基本上就可以正常使用了。
2.3、创建一个消费者
2.4、模拟对方推送数据测试
起初,通过这种单条数据消费方式,进行测试程序没太大毛病!
但是,当上到生产之后,发现一个很大的问题,就是消费1000万条数据,至少需要3个小时,结果导致数据看板一直没数据。
第二天痛定思痛,决定改成批量消费模型,怎么操作呢,请看下面!
2.5、将 kafka 的消费模式改成批量消费
首先,创建一个KafkaConfiguration
配置类,内容如下!
同时,新增一个spring.kafka.consumer.batch.concurrency
变量,用来设置并发数,通过这个参数我们可以指定几个线程来实现消费。
在application.properties
配置文件中,添加如下变量
最后,将单个消费方法改成批量消费方法模式
此时,消费性能大大的提升,数据处理的非常快,500万条数据,最多 30 分钟就全部消费完毕了。
本例中的消费微服务,生产环境部署了3台服务器,同时big_data_topic
主题的分区数为3
,因此并发数设置为3
比较合适。
随着推送的数据量不断增加,如果你觉得消费速度还不够,你可以重新设置每次批量拉取的最大数量,活着横向扩展微服务的集群实例数量和 topic 的分区数,以此来加快数据的消费速度。
但是,如果在单台机器中,每次批量拉取的最大数量过大,大对象也会很大,会造成频繁的 gc 告警!
因此,在实际的使用过程中,每次批量拉取的最大数量并不是越大越好,根据当前服务器的硬件配置,调节到合适的阀值,才是最优的选择!
三、小结
本文主要以SpringBoot
技术框架为背景,结合实际业务需求,采用 kafka 进行数据消费,实现数据量的高吞吐,在下篇文章中,我们会介绍消费失败的处理流程。
