mq常见问题
1、优点
异步,削峰,解耦
2、缺点
1)稳定性变差,依赖mq,如果mq挂了就导致系统崩溃。
2)系统复杂性提高,要解决消息丢失、重复消费、顺序消费等问题。
3)一致性问题,A系统推送到三个消息由B、C、D去消费,BC成功,D失败,此时A认为已经成功了,一般用分布式锁来处理。
3、如何保证高可用
namserver配置集群
broker配置双主双从
4、消息丢失了怎么办?
分析三种情况:
1)生产者没有成功将消息推送到broker
2)消息推送到borker,然后broker宕机了,此时存在缓存中的消息丢失
3)消息由broker推送到消费者,但消费者没有成功消费这笔数据,但broker认为这笔数据已经消费,不会再重复推送了。
解决方案:
1)生产者消息发送到MQbroker后,MQ给生产者一个确认收到
2)MQbroker收到消息后,持久化这条数据
3)消费者成功消费信息后进行ack确认
4)MQ收到消费这ack确认后删除这条数据。
5、怎么保证消息不被重复消费
一般原因是网络延迟,导致MQ长时间没收到确认,然后重复又发了一笔消息
消息发送者发送消息时携带一个全局唯一id,消费者消费前先判断id是否在于reidis或者db有消费记录,如果没有则消费,并将消费记录存在库里
6、怎么保证消息按照顺序消费
一个订单有订单创建,订单付款,订单完成,这个需要顺序消费,但是多个订单可以并行消费。(不会要求全局消费,因为)
解决:生产者根据每个订单id将同一个订单的三条信息放到一个Queue中,多个消费者同时获取queue中的消息进行消费,MQ使用分段锁保证单个订单三条消息的发送顺序消费的
Queue有序消费
生产者MessageQueueSelecter匿名内部类,消费者使用MessageListenerOrderly()匿名内部类
7、大量消息堆积怎么办
检查消费端是否正常,临时写代码将堆积的消息转存到容量更大的的MQ集群,增加多个消费者节点并行消费堆积信息,消费完毕后,恢复原始架构
8、消息过期了怎么办
1)发送者可以给消息定制一个时间,过期的消息放到死信队列,死信队列的消费者将消息放到数据库,然后从数据库再把这些数据重新查询出来发送到mq。