文章目录
- 1、 概要
- 2、 为什么使用MQ/使用MQ的好处?
- 3、 使用MQ的缺点?
- 4、 使用MQ会产生的问题及解决办法?
- 4.1、如何保证消息的顺序性?
- 4.2、如何解决消息被重复消费?
- 4.3、如何解决消息丢失?
- 4.4、如何解决消息积压的问题?
- 4.5、如何解决消息队列延迟以及过期失效的问题?
- 4.6、如何解决数据不一致的问题?
1、 概要
2、 为什么使用MQ/使用MQ的好处?
- **异步处理:**相比于传统的串行、并行方式,可以提高系统的吞吐量。
- **应用解耦:**系统间通过消息通信,不用关心其他系统的处理。
- **流量削峰:**可以通过消息队列长度控制请求量,可以缓解短时间内的高并发请求。
- **日志处理:**可以解决大量日志传输。
- **消息通讯:**消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯中。比如点对点消息队列或者聊天室。
3、 使用MQ的缺点?
- 系统可用性降低: 系统引入的外部依赖越多,系统面对的风险越高。如MQ挂了,系统也就挂掉了。
- **系统复杂性提高:**系统中引入MQ,如:如何保证没有重复消费?如何保证消息不丢失?如何保证消息的顺序性?等等一系列的问题。
- **数据一致性问题:**系统A处理完传递给MQ直接返回了成功,用户以为就已经处理成功了,结果在 BCD系统中,BC系统中写库成功,而D系统写库失败,这样就导致数据不一致。
4、 使用MQ会产生的问题及解决办法?
4.1、如何保证消息的顺序性?
- 生产者——MQServer——消费者 是一对一的关系
4.2、如何解决消息被重复消费?
**问题的产生:**在消息消费的过程中,如果出现失败的情况,通过补偿机制发送方会执行重试,重试的过程中就有可能产生重复的消息。
**问题解决:**换种说法就是如何保证消费端的幂等性(幂等性,就是一条命令,任意多次执行所产生的影响均与一次执行的影响相同),只要消费端具备了幂等性,那么重复消费消息的问题也就解决了。
4.3、如何解决消息丢失?
**问题的产生:**不论生产者、MQ服务器还是消费者都会产生消息丢失的问题。
**问题解决:**生产方增加一张消息发送表,生产者发送消息后会往消息发送表中插入一条数据状态标记为待确认,如果消费者消费成功后,调用生产者的api来更新该消息的状态为已确认。使用jod定时去检查消息发送表,如果存在状态是待确认的消息,则认为该消息已经丢失,重新发送消息。
4.4、如何解决消息积压的问题?
临时紧急扩容,增加消费端的数量,与此同时,降级一些非核心的业务。其次,要排查解决异常的问题,通过监控、日志等手段分析是否消费端的业务逻辑代码出现了问题从而优化消费端的业务处理逻辑。
4.5、如何解决消息队列延迟以及过期失效的问题?
RabbitMQ是可以设置过期时间的,如果消息在消息队列中积压超过一定的时间就会被RabbitMQ清理掉,这个数据就没了。这就造成了数据丢失,此时需要采取的一个方案是批量重导:过了高峰期,写一个临时程序,将丢失的数据一点一点查出来,然后重新灌入MQ里边,把丢失的数据补回来。
4.6、如何解决数据不一致的问题?
**保证数据最终一致性。**将消费失败的消息写入重试表中,通过jod定时进行重试。