Kafka实战:如何把Kafka消息时延秒降10倍

Kafka实战:如何把Kafka消息时延秒降10倍

大家好,又见面了,我是你们的朋友全栈君。

背景

国内某大型税务系统,业务应用分布式上云改造。

业务难题
Kafka实战:如何把Kafka消息时延秒降10倍
如上图所示是模拟客户的业务网页构建的一个并发访问模型。用户在页面点击从而产生一个HTTP请求,这个请求发送到业务生产进程,就会启动一个投递线程(Deliver Thread)调用Kafka的SDK接口,并发送3条消息到DMS(分布式消息服务),每条消息大小3k,需要等待3条消息都被处理完成后才会返回请求响应⑧。当消息达到DMS后,业务消费进程调用Kafka的消费接口把消息取出来,然后将每条消息放到一个响应线程(Response Thread)中进行处理,响应线程处理完后,通过HTTP请求通知投递线程,投递线程收到响应后返回回复响应。

100并发访问时延500ms,未达成用户业务要求

客户提出了明确的要求:每1个两核的ECS要能够支撑并发访问量100,每条消息端到端的时延范围是几十毫秒,即从生产者发送开始到接收到消费者响应的时间。客户实测在使用了DMS的Kafka 队列后,并发访问量为100时时延高达到500ms左右,甚至出现达到秒级的时延,远未达到客户提出的业务诉求。相比较而言,客户在Pod区使用的是自己搭建的原生Kafka,在并发访问量为100时测试到的时延大约只有10~20ms左右。那么问题来了,在并发访问量相同的条件下,DMS的Kafka 队列与Pod区自建的原生Kafka相比为什么时延会有这么大的差异呢?我们DMS的架构师 Mr. Peng对这个时延难题进行了一系列分析后完美解决了这个客户难题,下面就让我们来看看他的心路历程。

难题剖析

根据模拟的客户业务模型,Mr. Peng在华为云类生产环境上也构造了一个测试程序,同样模拟构造了100的并发访问量,通过测试发现,类生产环境上压测得到的时延平均时间在60ms左右。类生产上的时延数值跟客户在真实生产环境上测到的时延差距这么大,这是怎么回事呢?问题变得扑朔迷离起来。

Mr. Peng当机立断,决定就在华为云现网上运行构造的测试程序,来看看到底是什么原因。同时,在客户的ECS服务器上,也部署了相同的测试程序,模拟构建了100的并发量,得到如下的时延结果对比表:

调优前时延 现网时延(ms) 类生产时延(ms)
100并发 500ms ~ 4000ms 40ms ~ 80 ms
1并发 31ms 6ms
Ping测试 0.9ms ~ 1.2ms 0.3ms ~ 0.4ms

表1 华为云现网与类生产环境时延对比表

从时延对比表的结果看来,Mr. Peng发现,即使在相同的并发压力下,华为云现网的时延比类生产差很多。Mr. Peng意识到,现在有2个问题需要分析:为什么华为云现网的时延会比类生产差?DMS的Kafka队列时延比原生自建的Kafka队列时延表现差的问题怎么解决?Mr. Peng进行了如下分析:

时延分析

回归问题的本质,DMS Kafka队列的时延到底是怎么产生的?可控的端到端时延具体分为哪些?Mr. Peng给出了如下的计算公式:

总时延 = 入队时延 + 发送时延 + 写入时延 + 复制时延 + 拉取时延

让我们来依次了解一下,公式中的每一项都是指什么。

入队时延: 消息进入Kafka sdk后,先进入到要发送分区的队列,完成消息打包后再发送,这一过程所用的时间。

发送时延:消息从生产者发送到服务端的时间。

写入时延:消息写入到Kafka Leader的时间。

复制时延:消费者只可以消费到高水位以下的消息(即被多个副本都保存的消息),所以消息从写入到Kafka Leader,到所有副本都写入该消息直到上涨至高水位这段时间就是消息复制的时延。

拉取时延:消费者采用pull模式拉取数据,拉取过程所用的时间。

(1) 入队时延

现网是哪一部分的时延最大呢?通过我们的程序可以看到,入队列等待发送时延非常大,如下图:
Kafka实战:如何把Kafka消息时延秒降10倍

即消息都等待在生产端的队列中,来不及发送!
我们再看其他时延分析,因为无法在现网测试,我们分别在类生产测试了相同压力的,测试其他各种时延如下:

(2) 复制时延
以下是类生产环境测试的1并发下的
Kafka实战:如何把Kafka消息时延秒降10倍
从日志上看,复制时延包括在remoteTime里面,当然这个时间也会包括生产者写入时延比较慢导致的,但是也从一定的程度反映复制时延也是提升性能时延的一个因素。

(3) 写入时延

因为用户使用的是高吞吐队列,写入都是异步落盘,我们从日志看到写入时延非常低(localTime),可以判断不是瓶颈。发送时延与拉取时延都是跟网络传输有关系,这个优化主要是通过调TCP的参数来决定的。轻轻松松把Kafka消息时延秒降10倍,就用华为云DMS:https://www.huaweicloud.com/product/dms.html
Kafka实战:如何把Kafka消息时延秒降10倍

转载于:https://blog.51cto.com/13739602/2114930

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107522.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • dataloader 源码_DataLoader

    dataloader 源码_DataLoaderimportpaddle.fluidasfluidimportnumpyasnpBATCH_NUM=10BATCH_SIZE=16EPOCH_NUM=4CLASS_NUM=10ITERABLE=True#whetherthecreatedDataLoaderobjectisiterableUSE_GPU=False#whethertous…

    2022年6月11日
  • JDK安装、java环境配置

    JDK安装、java环境配置

    2021年10月23日
  • calico文件_ico文件怎么打开

    calico文件_ico文件怎么打开k8s的网络插件,可以使用下面的,镜像可以自己修改。

    2022年10月29日
  • linux使用docker_docker bash

    linux使用docker_docker bash安装命令sudoaptinstalldocker.io查看安装sudodocker–version添加用户到docker组sudogpasswd-a$USERdocker重启dockersudosystemctlrestartdocker查看状态sudodockerps-a查看镜像sudodockerimages创建容器dockerrun-it–nameubuntu1ubuntudockerrun-…

    2022年9月17日
  • c++中对象和类的关系_类的对象只能访问该类的私有成员

    c++中对象和类的关系_类的对象只能访问该类的私有成员类以及类和对象的关系以及类的访问修饰符一.类的概念:二.类和对象的关系:三.类的组成:四.类的创建:五.类的访问修饰符:一.类的概念:类是对于某一类对象的一个统称,类是对象的抽象化,对象是类的实例。定义一个类时,相当于定义了一个数据类型的蓝图。但实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作,就是单纯的进行了一个定义。二.类和对象的关系:类就是对象的抽象化概念,一个类就是一个对象集合的总称,通俗的来讲就是对象需要什么这个类就提供什么

    2022年10月23日
  • 8 款免费的 MySQL 数据库建模工具

    数据库建模和设计是软件开发过程中必不可少的步骤,一个良好的建模工具可以帮助我们简单快速地完成数据库设计,提高工作的效率。因此,今天给大家推荐几款免费的MySQL数据库建模工具,包括MySQLWorkbench、SQLPowerArchitect、PDMan、RISE、GenMyModel、DBDesigner、dbdiagram.io、Freedgo。

    2022年4月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号