消息队列技术是分布式应用间交换信息的一种技术。
消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。
通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。
1、RabbitMQ
- RabbitMQ是一个消息代理和队列服务器
- Producer生产者
- Connection 连接 (本质是 TCP 连接)
- Channel 信道
- Exchange 交换机
- Queue 队列
- RoutingKey 路由键
- Consumer 消费者
- Ack 消息确认
- onMessage 回调函数
PS:为什么要用信道
多个线程需要从 RabbitMQ 中消费消息,或者生产消息,每个线程把持一个信道,复用了 Connection的 TCP 连接,可以在产生性能瓶颈的情况下有效地节省 TCP 连接资源。
交换机类型
- Direct:如果消息的routing key与binding的routing key直接匹配的话,消息将会路由到该队列上;
- Topic:如果消息的routing key与binding的routing key符合通配符匹配的话,消息将会路由到该队列上;
- Fanout:不管消息的routing key和参数表的头信息/值是什么,消息将会路由到所有队列上。
2、在架构中的用法
异步处理:消息推送,用户注册。
发布订阅:状态通知,业务数据同步。
流量消峰:秒杀抢购场景。
3、异常情况
1)消息堆积
解决方法:临时扩容,加快消费速度。
如果长时间大量消息没处理,丢弃+批量重导(先去mq消费并丢弃,后面再补重要的)。
2)消息已推送,但未到队列,存在消费遗漏
3)消息已过期
解决方法:rabbitmq是可以设置过期时间的,就是TTL,积压一段时间是会被清理掉的。那么丢失了数据后,只能批量重导(流量低峰期,手动去查询丢失的那部分数据,然后将消息重新发送到mq里面,把丢失的数据重新补回来)。
4)服务器异常,消息丢失
4、测试时关注的点
1)验证发送mq的测试数据
2)验证是否触发mq消息成功
3)异常情况测试
①消息队列满,是否存在消息堆积情况。
②某台消息队列服务器宕机情况下,考虑丢失消息的恢复性以及新的消息不会继续发往宕机的服务器。
源自公众号 测试开发交流