Kafka性能调优实战:同等资源配置性能提升20几倍的秘诀

简介: Kafka性能调优实战:同等资源配置性能提升20几倍的秘诀

1、抛出问题


笔者最近在折腾数据异构体系,在实现MySQL增量数据同步到MQ(Kafka、RocketMQ),本文的故事就从这里开始。


众所周知,为了提高写入端的并发性能,通常会采用多线程并发机制,提高写入端的性能,接下来基于MySQL增量同步到Kafka为例,阐述一下第一版的架构方案。

c0fd5bb24c03819bdd5b8919777aba69.png

真实的数据同步架构设计复杂性远比上面复杂,上图旨在阐述Kafka的使用特点:


为了提高性能,通常会引入多线程,故组内同事直接采用多线程,通过创建多个线程,每一个线程单独创建一个KafkaProducer对象,然后binlog解析器后,按照分区键进行负载均衡。


但发现,性能非常低下,为什么呢?该如何处理呢?


2、多线程在Kafka这里为啥不好使了


当发现性能比较慢,然后又按照 Kafka性能优化指南进行调优,对linger.ms,batch.size等参数进行调优,但发现毫无用处,这是为啥呢?


42763519b26264f4653465d695e8449f.png

Kafka的高吞吐率设计的核心要点之一是批处理,即kafka在消息发送端引入了一个双端队列,应用程序通过KafkaProducer的send方法时,会将消息先放入到双端队列,然后kafka使用一个异步线程从队列中成批发送消息。


为了确保sender线程能一次发送较多数据,kafka在客户端引入了一个参数linger.ms,默认为200ms,即小心进入到缓存区后不会立即被send线程发送,而是等待一定时间,这样能提高send线程的发送效率,提高吞吐率。


再回到上述到场景,将视角切换到单个线程,在单个线程内,应用方调用KafkaProducer后,消息会在缓存区中等待200ms,但由于是数据同步场景,消息发送使用的是同步发送,这样就会导致不管send线程等多久,永远只会有一条消息被发送,每条消息发送还要无缘无故的增加200ms的延迟,tps怎能上去?


第一个优化点:还是基于多线程发送,当多线程共同持有一个KafkaProducer对象,这样在同一时间会有更多数据到达KafkaProducer的缓存区,Sender线程就可以实现一次发送多条消息,实现批量发送到效果,从而提升Kafka的吞吐率,实现高TPS,其效果如下图所示:

226f9c96a04a4a61222a6c44a0df5faa.png


关键点:对于单个线程,由于要保证消息都顺序性,使用的是同步发送模式。


3、“大杀器”异步发送也能保证顺序


众所周知,在数据异构的架构体系中,通常需要将分库分表的mysql数据库中的数据同步到es,从而实现跨库join等复杂查询功能。


数据同步为了确保数据的最终一致性,通常必须保证顺序。但其维度可以为表级别、数据行级别,通常只需要保证同一行数据的不同事件(新增、更新、删除)等事件必须顺序执行,所以在上述的架构中采用的是同步发送。


有没有可能使用异步发送,但同时满足顺序语义呢?


答案当然是可以的,其设计思路为:将消息分批处理,该批次内部消息并发执行,各个批次顺序执行。示意图如下:

d6782a033544beec82da66a90dbdf548.png

将消息分成批次,批次1必须要先与批次2执行,但在执行一个批次的时候,如果这个批次中的消息的key(例如id)不相同,那这批消息内部其实是无需保证其顺序的,就可以将这批消息异步发送,使每条消息并发发送,大大提高其并发度,TPS将得到进一步提升。


温馨提示:如果一个批次中的消息存在相同的key,需要将这些消息进行分割,确保一个并发批次没有重复key。


同步转异步,如果目标端是RocketMQ,其优化效果会更加显著。

相关文章
|
2月前
|
消息中间件 Kafka 测试技术
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
|
2月前
|
消息中间件 传感器 缓存
为什么Kafka能秒杀众多消息队列?揭秘它背后的五大性能神器,让你秒懂Kafka的极速之道!
【8月更文挑战第24天】Apache Kafka作为分布式流处理平台的领先者,凭借其出色的性能和扩展能力广受好评。本文通过案例分析,深入探讨Kafka实现高性能的关键因素:分区与并行处理显著提升吞吐量;批量发送结合压缩算法减少网络I/O次数及数据量;顺序写盘与页缓存机制提高写入效率;Zero-Copy技术降低CPU消耗;集群扩展与负载均衡确保系统稳定性和可靠性。这些机制共同作用,使Kafka能够在处理大规模数据流时表现出色。
41 3
|
2月前
|
消息中间件 Java Kafka
"Kafka快速上手:从环境搭建到Java Producer与Consumer实战,轻松掌握分布式流处理平台"
【8月更文挑战第10天】Apache Kafka作为分布式流处理平台的领头羊,凭借其高吞吐量、可扩展性和容错性,在大数据处理、实时日志收集及消息队列领域表现卓越。初学者需掌握Kafka基本概念与操作。Kafka的核心组件包括Producer(生产者)、Broker(服务器)和Consumer(消费者)。Producer发送消息到Topic,Broker负责存储与转发,Consumer则读取这些消息。首先确保已安装Java和Kafka,并启动服务。接着可通过命令行创建Topic,并使用提供的Java API实现Producer发送消息和Consumer读取消息的功能。
59 8
|
2月前
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
70 7
|
3月前
|
消息中间件 存储 缓存
面试题Kafka问题之Kafka的生产消费基本流程如何解决
面试题Kafka问题之Kafka的生产消费基本流程如何解决
37 1
|
3月前
|
消息中间件 Kafka
面试题Kafka问题之RabbitMQ的路由配置工作如何解决
面试题Kafka问题之RabbitMQ的路由配置工作如何解决
53 1
|
2月前
|
消息中间件 存储 Kafka
现代消息队列与云存储问题之Kafka在海量队列场景下存在性能的问题如何解决
现代消息队列与云存储问题之Kafka在海量队列场景下存在性能的问题如何解决
|
3月前
|
消息中间件 NoSQL Redis
实时计算 Flink版产品使用问题之配置了最大连续失败数不为1,在Kafka的精准一次sink中,如果ck失败了,这批数据是否会丢失
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
消息中间件 存储 缓存
微服务数据问题之Kafka的默认复制配置如何解决
微服务数据问题之Kafka的默认复制配置如何解决
下一篇
无影云桌面