性能测试之中间件:一篇文章告诉你什么是 kafka 和 MQ

前言

在做项目的性能测试时,MQ和Kafka经常会是项目服务架构中非常重要的组成部分,负责处理大量的实时数据流,如日志收集、消息队列、事件流处理等,Kafka和MQ的性能会直接影响整个系统的表现。所以,我们做性能测试的时候经常也需要关注一下MQ中间件的性能。

消息队列【MQ】

消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来存储消息的队列,我们可以简单理解消息队列就是将需要传输的数据存放在队列中。

而真正用来存储消息的软件(组件)叫做消息队列中间件。举个例子来理解,为了分析网站的用户行为,我们需要记录用户的访问日志。这些一条条的日志,可以看成是一条条的消息,我们可以将它们保存到消息队列中。将来有一些应用程序需要处理这些日志,就可以随时将这些消息取出来处理。

目前市面上的消息队列的中间件有很多,例如:Kafka、RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ等。

MQ应用场景

1、异步处理

举例:电商网站中,新的用户注册时,需要将用户的信息保存到数据库中,同时还需要额外发送注册的邮件通知、以及短信注册码给用户。但因为发送邮件、发送注册短信需要连接外部的服务器,需要额外等待一段时间,这样就会造成用户的响应时间很长,体验很差:

图片.png

所以,此时我们就可以使用消息队列来进行异步处理,从而实现快速响应,提高用户的体验。

图片.png

2、系统解耦

比如: 用户秒杀需要下单,访问订单系统的时候订单系统需要保存用户的订单信息,并且调用接口访问库存系统,让库存系统同步减少库存;

在这个业务流程里,如果库存系统出现的问题,就会导致订单系统下单失败,而且如果库存系统接口修改了,会导致订单系统也无法工作了!这样的设计,会让两个系统之间的依赖性很强,系统出现问题的场景就会比较多。

图片.png

为了解决以上问题,我们可以使用消息队列来实现系统和系统之间的解耦。如下图所示:

图片.png

3、流量削峰

这个场景也比较常见,比如我们用12306抢火车票的时候:上亿的用户会同时对服务器发起请求,每一个请求都会去业务数据库里请求数据查询或者变更上的话,数据库压力就会很大;而且人越多反应越慢,用户可能越会疯狂刷新页面,这样会造成更大的并发,瞬间会压垮mysql。

图片.png

所以,为了解决以上的问题,我们同样可以使用消息队列,因为消息队列的吞吐量比起业务数据库的吞吐来你跟要大很多:mysql数据库的吞吐量大概8000左右,消息队列比如kafka中间件的吞吐量大概在10w左右。 用户发给服务器的请求,服务器先发给消息队列,然后立马可以给用户返回,用户端能看到的信息就可能是在排队中。 这样用户有收到响应就不会疯狂刷新页面,造成更大的压力了。

图片.png

4、日志处理

大型电商网站(淘宝、京东、国美、苏宁...)、App(抖音、美团、滴滴等)等需要分析用户行为,要根据用户的访问行为来发现用户的喜好以及活跃情况,需要在页面上收集大量的用户访问信息。

图片.png

Kafka

了解了消息队列之后,kafka作为MQ中非常主流的一个的中间件,我们来介绍一下kafka。

kafka是一个分布式、高吞吐量、高扩展性的消息队列系统。主要应用在日志收集系统和消息系统,也可以叫做KafkaMQ。总之,Kafka比其他消息队列要好一点,优点也比较多,稳定性和效率都比较高。

kafka的诞生背景

kafka的诞生,是为了解决linkedin的数据管道问题,起初linkedin采用了ActiveMQ来进行数据交换,大约是在2010年前后,那时的ActiveMQ还远远无法满足linkedin对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,linkedin决定研发自己的消息传递系统,当时linkedin的首席架构师jay kreps便开始组织团队进行消息传递系统的研发。

在大数据技术领域,一些重要的组件、框架都支持Apache Kafka,不论成成熟度、社区、性能、可靠性,Kafka都是非常有竞争力的一款产品。

kafka的重要概念

1)producer(生产者):生产者就是发送消息的,生产者每发送一个条消息必须有一个Topic(主题),也可以说是消息的类别,生产者源源不断的向kafka服务器发送消息。

2)Topic(主题):每一个发送到Kafka的消息都有一个主题,也可叫做一个类别,类似我们传统数据库中的表名一样,比如说发送一个主题为order的消息,那么这个order下边就会有多条关于订单的消息,只不过kafka称之为主题,都是一样的道理;

3)Partition(分区):生产者发送的消息数据Topic会被存储在分区中,这个分区是想把数据分成多个块,达到负载均衡,合理的把消息分布在不同的分区上,分区是被分在不同的B服务器上,这样我们大量的消息就实现了负载均衡。每个Topic可以指定多个分区,但是至少指定一个分区。每个分区存储的数据都是有序的,不同分区间的数据不保证有序性。因为如果有了多个分区,消费数据的时候肯定是各个分区独立开始的,有的消费得慢,有的消费得快肯定就不能保证顺序了。那么当需要保证消息的顺序消费时,我们可以设置为一个分区,只要一个分区的时候就只能消费这个一个分区,那自然就保证有序了。

4) Replica(副本):副本就是分区中数据的备份,是Kafka为了防止数据丢失或者服务器宕机采取的保护数据完整性的措施,一般的数据存储软件都应该会有这个功能。如果有某些服务器宕机,我们可以通过副本恢复数据,也可以暂时用副本中的数据来使用。

5)Broker(实例或节点):就是Kafka的实例,启动一个Kafka就是一个Broker,多个Brokder构成一个Kafka集群,这就是分布式的体现,服务器多了自然吞吐率效率啥的都上来了。

6)Consumer Group(消费者组)和 Consumer(消费者):Consume消费者来读取Kafka中的消息,可以消费任何Topic的数据,多个Consume组成一个消费者组,一般的一个消费者必须有一个组(Group)名,如果没有的话会被分一个默认的组名。

如下图就包括了2个Producer(生产者),一个Topic(主题),3个Partition(分区),3个Replica(副本),3个Broker(Kafka实例或节点),一个Consumer Group(消费者组),其中包含3个Consumer(消费者)

图片.png

kafka 在性能测试中的应用场景

1、在什么样的项目里需要关注kafka的性能?

如果 Kafka 是项目中数据流处理的核心部分,负责处理大量的实时数据流,如日志收集、消息队列、事件流处理等,或者项目需要处理高吞吐量数据的场景中,Kafka 的性能会直接影响整个系统的表现。如果系统依赖 Kafka 处理和传递大量消息,测试 Kafka 的吞吐量、延迟等指标是至关重要的。

2、在性能测试或实际生产环境中,以下一些关键指标的异常可能表明 Kafka 出现了问题,我们需要去分析和调优:

1) 吞吐量下降:系统整体的消息处理速度明显下降,即每秒处理的消息数量减少。Kafka 的生产者或消费者无法以预期的速度发送或接收消息。
2)消息延迟增加:从生产者发送消息到消费者接收到消息的时间(端到端延迟)显著增加。
3)消费者滞后(Lag)增加:Kafka 消费者滞后明显增加,即消费者无法及时处理已提交到 Kafka 的消息,造成未消费的消息积压。
4)磁盘 I/O 使用率过高:Kafka Broker 的磁盘 I/O 使用率接近或达到100%,导致系统性能下降。
5)CPU 使用率过高:Kafka Broker 的 CPU 使用率持续高企,导致其他任务无法顺利执行。
6)网络带宽占用率过高:Kafka Broker 的网络带宽使用接近或达到上限,导致消息传输延迟或丢包。
7)高频率的垃圾回收(GC)活动:Kafka Broker 出现频繁的垃圾回收活动,导致系统停顿和性能下降。
8)高频率的 ISR 列表变动:Kafka 的 ISR(In-Sync Replica)列表频繁变动,导致分区副本状态不稳定。
9)消息丢失或重复:系统中出现了消息丢失或重复消费的现象,影响了数据的一致性。
10)集群的稳定性下降:Kafka 集群中频繁出现节点失效、分区不可用、重新平衡等现象。
回帖
请输入回帖内容 ...