消息队列的测试点
- 一、常用的消息队列产品
- 1、挑战性问题
- 二、kafka简介
- 三、消息的生产
- 四、消息的存储
- 五、Kafka的特性
- 六、kafka测试要点
一、常用的消息队列产品
基于内存的消息队列
- RabbitMQ:适用于处理高并发场景,广泛用于即时消息传递
- RabbitMQ:适合轻量级应用,例如日记收集、任务分发
基于磁盘的消息队列
- Kafka:高吞吐显著,适合大数据处理,常用于构建实时数据管道和流式应用
- kafka能够支持每秒数百万级别的消息吞吐量,适合构建高流量的实时消息系统。
高吞吐选择kafka
低延迟选择RabbitMQ
1、挑战性问题
二、kafka简介
Kafka是一个分布式、基于发布/订阅的消息系统;支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以,实时的处理大量数据以满足各种需求场景
Kafka 是集群架构的,有多个broker 物理节点,Topic 和 Partition 存储在 broker 物理节点中,ZooKeeper负责维护这些broker,管理着所有的 Topic 和 Partition。
如上图所示,一个典型的kafka集群中包含若干producer,若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用puIl模式从broker订阅并消费消息
- Broker
- Kafka集群包含一个或多个服务器,这种服务器被称为broker,Kafka中使用Broker来接受Producer和Consumer的请求,并把Message持久化到本地磁盘。每个Cluster当中会选举出一个Broker来担任Controller,负责处理Parition的Leader选举,协调Partition迁移等工作。
- Topic
- 每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)
- Partition
- parition是物理上的概念,每个topic包含一个或多个partition,创建topic时可指定parition数量。每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件
- Producer
- 负责发布消息到Kafka broker
- Consumer
- 消费消息。每个consumer属于一个特定的consumer group(可为每个consumer指定group name,若不指定group name则属于默认的group)。使用consumer high level APl时,同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息
- Offset(偏移量)
- 消息在Parition中的编号,编号顺序不跨Partition。在kafka中生产者和消费者主要就是依靠Offset进行控制消息的发送和消费
举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡蛋就丢失了。
再比如生产者很强劲(大交易量的情况),生产者1秒钟生产100个鸡蛋,消费者1秒钟只能吃50个鸡蛋,那要不了一会,消费者就吃不消了(消息堵塞,最终导致系统超时),消费者拒绝再吃了,“鸡蛋"又丢失了。
这个时候我们放个篮子在它们中间,生产出来的鸡蛋都放到篮子里,消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,都在篮子里,而这个篮子就是"kafka”。鸡蛋其实就是“数据流”,系统之间的交互都是通过“数据流”来传输的,也叫“消息”。
消息队列满了,其实就是篮子满了,”鸡蛋“放不下了,那赶紧多放几个篮子,其实就是kafka的扩容。
三、消息的生产
1)Producer发送消息,默认采用随机负载均衡的模式发送消息
2)Producer发送消息,可以采用自己制定的负载均衡的模式发送消息。
3)也可以在发送一条消息时,指定这条消息的key,Producer根据这个key和Parition机制来判断应该将这条消息发送到哪个Parition,则key相同的消息会被发送并存储到同一个parition里,而且key的序号正好和Parition序号相同。(Parition序号从0开始,本例中的key也从0开始)*
Partition:3, Message Payload:The 1 message for key 3
Partition:3, Message Payload:The 2 message for key 3
Partition:3, Message Payload:The 3 message for key 3
Partition:3, Message Payload:The 4 message for key 3
Partition:3, Message Payload:The 5 message for key 3
Partition:1, Message Payload:The 1 message for key 1
Partition:1, Message Payload:The 2 message for key 1
Partition:1, Message Payload:The 3 message for key 1
Partition:1, Message Payload:The 4 message for key 1
Partition:1, Message Payload:The 5 message for key 1
四、消息的存储
谈到kafka的存储,就不得不提到分区,即partitions,创建一个topic时,同时可以指定分区数目,分区数越多,其吞吐量也越大,但是需要的资源也越多,同时也会导致更高的不可用性,kafka在接收到生产者发送的消息之后,会根据均衡策略将消息存储到不同的分区中。
在每个分区中,消息以顺序存储,最晚接收的的消息会最后被消费。
每个partition为一个目录,pariton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1
五、Kafka的特性
(1)高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition,consumer group 对partition进行consume操作;
(2)可扩展性:kafka集群支持热扩展;
(3)持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
(4)容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败);
(5)高并发:支持数千个客户端同时读写;
(6)支持实时在线处理和离线处理:可以使用Storm这种实时流处理系统对消息进行实时进行处理,同时还可以使用Hadoop这种批处理系统进行离线处理;
六、kafka测试要点
正常:
-
生产的消息
- 消息的正确性:
-
验证不同类型的消息能否成功发送到队列(文本、二进制数据)
-
字段是否正确、业务场景是否正确、是否正常落库
-
生产的符合业务场景的消息
-
- 消息发送的频率控制
- 验证系统能够处理高频率的消息发送,保证消息队列的稳定性
- 消息的正确性:
-
消费的消息
- 消息队列的连接测试
- 验证消息队列客户端能否成功建立连接,并确保连接状态,例如RabbitMQ连接测试
- 消息接收确认机制
- 检查消息队列是否能够正确处理消息确认,确保消息被正确消费
- 消息接收顺序性
- 测试消息是否按照发送顺序被接收,保证数据的一致性和顺序性
- 消息队列的连接测试
异常:
- 生产者异常
- 相同的数据是否重复生产消息,重复生产是否有拦截
- 写入数据库异常时,是否有重试
- 生产的速度,过快是否有消息堆积
- 消费者异常
- 相同的消息是否不重复消费
- 消费异常时是否能补单
消息持久化测试
验证消息队列在系统故障后能够正确恢复消息状态
队列管理测试
验证队列的属性设置:最大消息大小、消息过期时间
多消费者模式
多个消费者同时从同一个队列接收消息,验证消息分配是否合理(轮询、权重)
性能-吞吐量
监控在高吞吐下系统的资源(CPU、内存)的使用情况
性能-延迟
测试消息从发送到被处理的平均时间,确保系统相应速度符合预期
测试消息在不同的网络条件下发送消息的时间
测试在高负载的情况下测试消息的延迟性,确保在压力的情况下,仍然能保持稳定性能
可靠性-消息重发机制
故意使消费者接收消息失败,检查消息队列是否能够自动重发
测试重发次数、重发间隔等参数是否这只有效
为防止消息重复处理,系统需要实现幂等性,确保消息重发不会影响业务逻辑
安全-访问权限
确保只有权限用户才能访问特定的消息队列,防止未授权访问
安全-数据加密
验证消息在传输和存储过程中是否能够被篡改
可拓展性测试
增加消息队列的节点数量,测试系统的性能和吞吐量是否能够线性提升。