
1) 【一句话结论】设计测试用例需模拟消息丢失的典型链路(客户端-队列、队列-服务端、服务端处理),结合消息持久化、重试机制及ACK确认,验证异常后消息能否按顺序恢复并最终送达,核心是通过多故障场景验证系统在异常下的消息恢复能力。
2) 【原理/概念讲解】实时消息系统消息丢失可能发生在客户端与消息队列的传输、队列到服务端的消费、服务端内部处理三个环节。测试需覆盖这些链路的异常。比如客户端发送时网络中断,队列到服务端时服务宕机,服务端处理失败。测试用例模拟这些故障,检查消息通过重试或持久化恢复。类比:快递中途丢失,系统需二次派送(重试)或记录(持久化)确保最终送达,顺序消息依赖队列FIFO,重试后顺序不变。
3) 【对比与适用场景】
| 测试场景 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 网络中断测试 | 模拟客户端与消息队列间网络中断 | 检查消息重试机制,验证队列持久化 | 客户端网络不稳定环境 | 需确保队列支持持久化(如Kafka的log.retention.ms足够长) |
| 服务宕机测试 | 模拟服务端处理消息时宕机(如进程崩溃) | 检查消息持久化与重试,验证重试策略 | 服务端故障场景 | 需验证消息最终恢复时间,重试次数与间隔 |
| 顺序消息重试测试 | 发送顺序消息,模拟故障后验证重试后消息顺序是否正确 | 依赖队列FIFO,重试不影响顺序 | 顺序消息场景(如聊天消息) | 需明确重试后消息是否按原顺序到达 |
| 高并发消息堆积测试 | 模拟高并发下队列消息堆积超过阈值 | 检查消息丢弃策略(如FIFO丢弃或按优先级) | 高流量场景 | 需明确丢弃规则,避免关键消息丢失 |
4) 【示例】测试环境搭建:1. 客户端(Python脚本,持续发送消息);2. 消息队列(Kafka,配置持久化,如log.retention.ms=3600s);3. 服务端(Java服务,实现重试逻辑)。测试步骤:1. 客户端发送1000条顺序消息(带唯一ID和顺序号);2. 第500条时模拟网络中断(延迟5秒);3. 发送剩余500条消息;4. 模拟服务端宕机(进程停止),观察队列未处理消息;5. 服务端重启后检查:a. 队列消息是否全部处理(无丢失);b. 重试次数(3次,指数退避:1s→2s→4s);c. 客户端消息顺序是否正确(与发送顺序一致)。预期结果:队列无消息丢失,服务端重试逻辑正确,客户端接收消息按顺序到达。
5) 【面试口播版答案】在测试实时消息系统的消息丢失问题时,我会设计一个结合异常模拟与结果验证的测试用例。首先搭建测试环境:包含模拟客户端、持久化消息队列(如Kafka,配置log.retention.ms为1小时)、服务端(实现消息重试逻辑)。测试步骤:1. 客户端持续发送1000条顺序消息(带唯一ID和顺序号);2. 在第500条时,模拟客户端与队列间的网络中断(如设置网络延迟5秒);3. 持续发送剩余500条消息;4. 模拟服务端宕机(进程停止),观察队列中未处理的消息;5. 服务端重启后,检查:队列中所有消息是否被服务端处理(无丢失),服务端重试次数(3次,指数退避),客户端接收消息的顺序是否与发送顺序一致。预期结果是队列无消息丢失,服务端重试逻辑正确,客户端接收消息按顺序到达。核心是通过模拟网络中断、服务宕机等异常,验证消息重试与持久化机制是否有效,确保系统在异常下仍能恢复消息并保持顺序。
6) 【追问清单】
7) 【常见坑/雷区】